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

Jad*_*son 6 .net multithreading

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

这导致以下问题:

  • 什么是关于UI和互操作的.NET框架线程模型?
  • 假设框架应该处理后台和UI线程之间的线程切换,我们是不正确的?
  • 在这种情况下使用Thread.Sleep和Application.DoEvents有什么区别,并且优先于另一个?

小智 3

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

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

另请阅读C# 中的线程