Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET线程模型和Application.DoEvents与Thread.Sleep_.net_Multithreading - Fatal编程技术网

.NET线程模型和Application.DoEvents与Thread.Sleep

.NET线程模型和Application.DoEvents与Thread.Sleep,.net,multithreading,.net,Multithreading,我们有一个桌面应用程序,它在后台线程中执行一组非常严格的计算。此计算的一部分在我们通过互操作访问的非托管库中执行。我们发现,当我们开始计算时,UI线程在计算期间变得无响应。我们的印象是,框架将处理线程切换,以允许UI继续响应,但事实并非如此。我们发现可以插入Thread.Sleep(0)或Application.DoEvents()以允许UI响应。这样做的副作用是减慢计算速度。此外,由非托管代码执行的部分计算可能需要30秒才能完成,在此期间,应用程序始终没有响应。整个计算可能需要两到五分钟才能完

我们有一个桌面应用程序,它在后台线程中执行一组非常严格的计算。此计算的一部分在我们通过互操作访问的非托管库中执行。我们发现,当我们开始计算时,UI线程在计算期间变得无响应。我们的印象是,框架将处理线程切换,以允许UI继续响应,但事实并非如此。我们发现可以插入Thread.Sleep(0)或Application.DoEvents()以允许UI响应。这样做的副作用是减慢计算速度。此外,由非托管代码执行的部分计算可能需要30秒才能完成,在此期间,应用程序始终没有响应。整个计算可能需要两到五分钟才能完成

这导致了以下问题:

  • 关于UI和互操作,.NETFramework线程模型是什么
  • 我们假设框架应该处理后台线程和UI线程之间的线程切换,这是错误的吗
  • 在这种情况下,使用Thread.Sleep和Application.DoEvents有什么区别,一种方法优于另一种方法

您可以降低后台线程的优先级,这样它将被操作系统更多地抢占。如果你有一些领域知识,导致你想控制它何时被抢占,你可以使用Thread.Sleep(0),如果有另一个线程等待,它会放弃你的时间片

Application.DoEvents将启动windows消息队列。这将导致您的应用程序响应击键或窗口大小调整等事件。Sleep将导致线程被抢占(或者在Thread.Sleep(0)的情况下不被抢占)


另请阅读

正确的方法是使用回调。请参阅使用异步方法的Silverlight模型(例如,用于检索web服务数据)。我知道这个问题已经“回答”了,但答案并不理想。

你最好的办法是创建自己的
线程
DoEvents
Thread.Sleep(0)
会阻止计算,降低计算速度。您可以将DLL调用包装在
线程启动
委托或
参数化线程启动
委托中,并在实例化
线程
时将委托名称用作参数。从这里开始,您所要做的就是调用
线程的Start方法。

注意:非常旧的Q&A;搜索更新的讨论,以获得有关当前可用解决方案的良好答案。