.NET线程模型和Application.DoEvents与Thread.Sleep
我们有一个桌面应用程序,它在后台线程中执行一组非常严格的计算。此计算的一部分在我们通过互操作访问的非托管库中执行。我们发现,当我们开始计算时,UI线程在计算期间变得无响应。我们的印象是,框架将处理线程切换,以允许UI继续响应,但事实并非如此。我们发现可以插入Thread.Sleep(0)或Application.DoEvents()以允许UI响应。这样做的副作用是减慢计算速度。此外,由非托管代码执行的部分计算可能需要30秒才能完成,在此期间,应用程序始终没有响应。整个计算可能需要两到五分钟才能完成 这导致了以下问题:.NET线程模型和Application.DoEvents与Thread.Sleep,.net,multithreading,.net,Multithreading,我们有一个桌面应用程序,它在后台线程中执行一组非常严格的计算。此计算的一部分在我们通过互操作访问的非托管库中执行。我们发现,当我们开始计算时,UI线程在计算期间变得无响应。我们的印象是,框架将处理线程切换,以允许UI继续响应,但事实并非如此。我们发现可以插入Thread.Sleep(0)或Application.DoEvents()以允许UI响应。这样做的副作用是减慢计算速度。此外,由非托管代码执行的部分计算可能需要30秒才能完成,在此期间,应用程序始终没有响应。整个计算可能需要两到五分钟才能完
- 关于UI和互操作,.NETFramework线程模型是什么
- 我们假设框架应该处理后台线程和UI线程之间的线程切换,这是错误的吗
- 在这种情况下,使用Thread.Sleep和Application.DoEvents有什么区别,一种方法优于另一种方法
另请阅读正确的方法是使用回调。请参阅使用异步方法的Silverlight模型(例如,用于检索web服务数据)。我知道这个问题已经“回答”了,但答案并不理想。你最好的办法是创建自己的
线程DoEvents
和Thread.Sleep(0)
会阻止计算,降低计算速度。您可以将DLL调用包装在线程启动
委托或参数化线程启动
委托中,并在实例化线程
时将委托名称用作参数。从这里开始,您所要做的就是调用线程的Start方法。注意:非常旧的Q&A;搜索更新的讨论,以获得有关当前可用解决方案的良好答案。