为什么用空的委托调用 ThreadStart?

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 线程)。

谢谢

Ree*_*sey 5

该线程将导致调用函数阻塞,直到 Dispatcher 的线程可以“处理”(无操作)委托。

这可能不是一个好的做法,应该删除。我怀疑这里的目标是让这个 (third)BackgroundWorker的完成事件成为前两个BackgroundWorkers 完成时的信号。

一般来说,像这样旋转以完成通常是糟糕设计的标志。更好的设计是使用CountdownEvent,它可以在两个BackgroundWorker实例完成时发出信号。

然后,您可以等待倒计时事件,而不是循环使用Thread.Sleep调度程序调用。