Tag: multithreading

静态方法是否共享其本地变量以及在不同线程的并发使用期间会发生什么?

C#问题 – 我试图确定是否可以使用静态方法,在方法中它确实使用了一些局部变量。 局部变量是否在方法的使用中“共享”? 例如,如果从不同的线程同时调用/使用静态方法会发生什么? 一个线程阻塞,直到另一个线程完成等吗? 也许通用的问题是,在线程应用程序中,何时“不”使用静态方法?

如何在后台线程中创建WPF控件?

我有创建后台线程的方法来做一些动作。 在这个后台线程中我创建了对象。 但是在运行时创建时这个对象给了我一个例外: 调用线程必须是STA,因为许多UI组件都需要这个。 我知道我必须使用Dispatcher来反映UI的内容。 但在这种情况下,我只是创建一个对象,而不是用UI迭代。 这是我的代码: public void SomeMethod() { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(Background_Method); worker.RunWorkerAsync(); } void Background_Method(object sender, DoWorkEventArgs e) { TreeView tv = new TreeView(); } 如何在后台线程中创建对象? 我使用WPF应用程序

如何使用Name属性枚举.NET中的线程?

假设我启动两个这样的线程: // Start first thread Thread loaderThread1 = new Thread(loader.Load); loaderThread1.Name = “Rope”; loaderThread1.Start(); // Start second thread Thread loaderThread2 = new Thread(loader.Load); loaderThread2.Name = “String”; loaderThread2.Start(); 有什么办法可以通过使用Name属性来枚举线程吗? 我希望能够检查具有特定名称的线程是否仍在运行。 我创建的每个线程都使用一组命名数据,数据集的名称用作处理数据的线程的名称。 在启动工作线程之前,我想查看同一组数据的任何先前线程是否已在运行。 我在使用System.Diagnostics.GetCurrentProcess().Threads时得到的线程System.Diagnostics.GetCurrentProcess().Threads是ProcessThread类型,而不是Thread !

SQL CLR等待不执行

我的理解是,当等待从等待返回时,等待完成执行代码的剩余部分。 我试图让它在sql clr中工作,并且这不能用作等待的进程和它下面的代码没有被执行。 在debug方法中,控件只在执行await行后返回。 我怎样才能完成这项工作,因为要求clr在不阻塞主线程的情况下执行,以便其他工作可以在db中继续运行。 我真的需要这个工作,现在已经有2天了。 NB如果方法是同步的,这很有效。 并且存储的proc程序集在sql server中注册为不安全。 我正在使用mssql 2012和visual studio 2015。 public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static async void sp_push_stock_update(SqlString transactionPrimaryKey, SqlString transactionType) { using (SqlConnection conn = new SqlConnection(“context connection=true”)) { StockUpdateClient.stock_fetcher _stockFetcher = new StockUpdateClient.stock_fetcher(conn); List skuList = await new System.Threading.Tasks.Task<List>(()=> _stockFetcher.getItems(transactionPrimaryKey, transactionType)); //Code does not get here performLogging(skuList): […]

如何在C#中停止一个线程?

我已经创建了一个客户端 – 服务器应用程序,并且在服务器上我希望有机会停止服务器,然后再次启动它。 问题是我无法阻止侦听Tcp连接的线程。 如何在C#中关闭线程? 谢谢。 private void KeepServer(){ while (this.connected) { tcpClient = tls.AcceptTcpClient(); Connection newConnection = new Connection(tcpClient); } }

Task.Run和预期的委托

我不确定如何从以下观察结果中理解。 var f = new Func(uc.ViewModel.SlowProcess); 1) (VALID) string dataPromise = await Task.Run(() => f(token), token); 2) (VALID) string dataPromise = await Task.Run(() => uc.ViewModel.SlowProcess(token), token); 3) (ERROR) string dataPromise = await Task.Run(f(token), token); uc.ViewModel.SlowProcess是一个将CancellationToken作为参数并返回字符串的方法。 项目1)和2)有效且工作正常。 第3项无效,给出以下错误: 错误1’System.Threading.Tasks.Task.Run(System.Func>,System.Threading.CancellationToken)’的最佳重载方法匹配有一些无效的参数 错误2参数1:无法从’string’转换为’System.Func>’ 为什么我不能将f(令牌)作为代理传递? 如果我使用不带参数的方法,它也可以。

C#套接字和multithreading

我想了解更多有关c#中的套接字和线程的信息。 我在网上遇到了很多很好的资源,以帮助我入门。 我到目前为止制作的程序是一个简单的“中间人”应用程序。 它的设计如下:client [application] server 鉴于以下代码,如何防止此线程以100%CPU运行? 如何让线程等待和阻塞数据,而不是在客户端/服务器空闲时退出? while (true) { lock (ClientState) { checkConnectionStatus(client, server); } if (clientStream.CanRead && clientStream.DataAvailable) { Byte[] bytes = new Byte[(client.ReceiveBufferSize)]; IAsyncResult result = clientStream.BeginRead(bytes, 0, client.ReceiveBufferSize, null, null); int size = clientStream.EndRead(result); sendData(bytes, serverStream, size); } if (serverStream.CanRead && serverStream.DataAvailable) { Byte[] bytes = new byte[(server.ReceiveBufferSize)]; IAsyncResult result […]

保持两个线程之间的布尔值同步

在一个线程(thread2)中,我更改了一个值,例如 CheckSuccess = false; 现在主线程(thread1 – GUI / Form)没有获取更改,如何“传播”所有线程周围的更改? 我的印象是线程应该操纵数据,而不是在单独的实例上工作(除非被告知这样做)

C#并行运行多个非阻塞外部程序

我需要从我的应用程序运行多个外部可执行文件的实例。 此可执行文件的平均运行时间约为3分钟。 我想重定向这些进程的输出,并在我的GUI中更新进度条。 当然,在我继续使用我的应用程序之前,我不想等待他们返回。 我想我应该为每个实例创建一个线程,并在线程完成时更新我的​​进度条。 这是正确的方法吗? 另外,您是否建议使用良好的资源/文档来了解它的工作原理? 我发现只有http://www.dotnetperls.com/threadpool 。 编辑:这些进程是基于网络的,即:运行时间可能会有很大差异,具体取决于链路延迟/带宽。 关于进度条,我想在每次进程完成时更新它。 那有处理程序吗? 稍后我将根据流程输出添加更详细的更新,以增加每个执行步骤的进度。 编辑2: 感谢您的投入。 由于我可能需要运行大量进程(最多20个),并且我不想使带宽饱和,因此我将并行运行5个最大值。 每次进程结束时,我都会递增进度计数器(对于我的进度条),然后运行另一个进度计算器直到它们全部完成,使用: Process p = new Process(); p.StartInfo.FileName = pathToApp; p.EnableRaisingEvents = true; p.Exited += OnCalibrationProcessExited; p.Start(); private void OnCalibrationProcessExited(object sender, EventArgs e) { runAnotherOne function } 这是正确的还是有更优雅的方式来实现这一目标? 我不希望我的应用程序在执行过程中被阻止。 为此使用后台工作者会更好吗?

在asp.net做预定的后台工作

我需要在我的asp.net应用程序中定期执行某项任务,所以这样做: protected void Application_Start() { Worker.Start(); } … public static class Worker { public static void Start() { ThreadPool.QueueUserWorkItem(o => Work()); } public static void Work() { while (true) { Thread.Sleep(1200000); //do stuff } } } 这种做法好吗? 我看到一个关于在这个网站上授予徽章的博客是使用asp.net缓存黑客完成的: http : //blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/