New*_*ian 3 c# wpf multithreading no-op
在我必须维护的旧应用程序中进行一些法医考古调查时,我遇到了这个:
这是一个最近转换为 .NET 4.0 的 WPF 应用程序,此代码在后台工作程序中运行
if(bgWorker1.IsBusy || bgWorker2.IsBusy)
{
Thread.Sleep(100);
Application.Current.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Background,
new System.Threading.ThreadStart(delegate { })
);
}
Run Code Online (Sandbox Code Playgroud)
1 - 通过使用无操作委托调用线程(主 gui)会实现什么可能的副作用。其他两个线程也在主 gui 线程上执行调用,但只有这个线程将优先级设置为 Normal 以外的其他线程(尽管它们使用 Action 而不是 TreadStart)。
2 - 我有一些奇怪地类似于此应用程序死锁的情况,有些东西告诉我这可能是原因。(无缘无故地绕过优先级和主 gui 线程)。
谢谢
该线程将导致调用函数阻塞,直到 Dispatcher 的线程可以“处理”(无操作)委托。
这可能不是一个好的做法,应该删除。我怀疑这里的目标是让这个 (third)BackgroundWorker的完成事件成为前两个BackgroundWorkers 完成时的信号。
一般来说,像这样旋转以完成通常是糟糕设计的标志。更好的设计是使用CountdownEvent,它可以在两个BackgroundWorker实例完成时发出信号。
然后,您可以等待倒计时事件,而不是循环使用Thread.Sleep调度程序调用。
| 归档时间: |
|
| 查看次数: |
1354 次 |
| 最近记录: |