我们有一个桌面应用程序,在后台线程中执行一组相当严格的计算。其中一部分计算是在我们通过互操作访问的非托管库中执行的。我们发现,当我们启动计算时,UI线程在计算持续时间内变得不响应。我们原本认为框架会处理线程切换以允许UI保持响应,但事实并非如此。我们发现可以插入Thread.Sleep(0)或Application.DoEvents()来使UI响应。这会导致计算速度变慢。此外,非托管代码执行的计算部分可能需要30秒才能完成,在此期间应用程序始终无响应。整个计算可能需要2到5分钟才能完成。
这引出了以下问题:
- .NET框架关于UI和互操作的线程模型是什么? - 我们是否错误地认为框架应该处理后台和UI线程之间的线程切换? - 在这种情况下使用Thread.Sleep和Application.DoEvents有什么区别,哪个更好?
这引出了以下问题:
- .NET框架关于UI和互操作的线程模型是什么? - 我们是否错误地认为框架应该处理后台和UI线程之间的线程切换? - 在这种情况下使用Thread.Sleep和Application.DoEvents有什么区别,哪个更好?