我有一个 WPF 应用程序,其中有两个后台工作线程,在加载时运行。
第一个 (bw1) 在应用程序启动时生成,第二个 (bw2) 在经过一段时间后生成。
我所处的情况是,我无法从第一个后台工作人员 (bw1) 的“worker_completed”中生成第二个后台工作人员 (bw2)。
目前,我有一个类级 bool 变量(默认false
),并在bw1的worker_completed中将其设置为true
。
在bw2开始时,我检查上面的 bool 值是否为假,如果是,bw2将休眠100毫秒。
这在很大程度上是有效的。我想改进它。
我可以在 bw1 中使用线程优先级(例如将其设置为最高)来确保 bw1 在 bw2 时执行 sleep 吗?
是否有一种事件驱动的方式可以实现这一目标?
最佳答案
当您实际上不知道事件何时发生时,忙旋转(即使处于 sleep 状态)是一个坏主意,因为您正在盲目检查并不必要地使用系统资源。
改用AutoResetEvent
。在 bw2 的代码开头调用 ev.WaitOne()
并在 bw1 的 work_completed
中调用 ev.Set()
来释放 bw2:
AutoResetEvent ev = new AutoResetEvent();
// bw1's work completed
private void bw1_workCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ev.Set(); // release bw2 from waiting
}
// bw2's do work
private void bw2_DoWork(object sender, DoWorkEventArgs e)
{
ev.WaitOne(); // wait for the signal from bw1
// code
}
关于c# - 如何确保特定的后台工作线程在另一个后台工作线程之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689489/