如何确保特定后台工作线程在另一个之前执行?

时间:2012-03-13 17:59:29

标签: c# multithreading backgroundworker thread-priority

我有一个带有两个后台工作线程的WPF应用程序,可以在加载时运行。

第一个( bw1 )在应用程序启动时生成,第二个( bw2 )在经过一段时间后生成。

我处于一种情况,我不能从第一个背景工作者( bw1 )中产生第二个背景工作者( bw2 )“worker_completed”。

目前,我有一个班级bool变量(默认false),并在 bw1 的worker_completed中设置true

bw2 的开头,我检查上面的bool是否为假,如果是, bw2 将睡眠100毫秒。

这在大多数情况下都有效。我想改进它。

  • 我可以在 bw1 中使用线程优先级(设置为最高,比方说),以确保在 bw2 时执行 bw1

  • 我是否有以事件为导向的方式来实现这一目标?

1 个答案:

答案 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
}