我有一个带有两个后台工作线程的WPF应用程序,可以在加载时运行。
第一个( bw1 )在应用程序启动时生成,第二个( bw2 )在经过一段时间后生成。
我处于一种情况,我不能从第一个背景工作者( bw1 )中产生第二个背景工作者( bw2 )“worker_completed”。
目前,我有一个班级bool变量(默认false
),并在 bw1 的worker_completed中设置true
。
在 bw2 的开头,我检查上面的bool是否为假,如果是, bw2 将睡眠100毫秒。
这在大多数情况下都有效。我想改进它。
我可以在 bw1 中使用线程优先级(设置为最高,比方说),以确保在 bw2 时执行 bw1 睡
我是否有以事件为导向的方式来实现这一目标?
答案 0 :(得分:4)
当您实际上不知道事件何时发生时,忙碌的旋转(即使是睡眠)也是一个坏主意,因为您正在盲目地检查并不必要地使用系统资源。
请改用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
}