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

标签 c# multithreading backgroundworker thread-priority

我有一个 WPF 应用程序,其中有两个后台工作线程,在加载时运行。

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

我所处的情况是,我无法从第一个后台工作人员 (bw1) 的“worker_completed”中生成第二个后台工作人员 (bw2)。

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

bw2开始时,我检查上面的 bool 值是否为假,如果是,bw2将休眠100毫秒。

这在很大程度上是有效的。我想改进它。

  • 我可以在 bw1 中使用线程优先级(例如将其设置为最高)来确保 bw1bw2 时执行 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/

相关文章:

c# - 使用不同的参数多次调用 BackgroundWorker.RunWorkerAsync()

c# - 程序关闭时后台工作线程没有关闭?

c# - 如何异步运行长时间运行的操作并在 ASP.Net Ajax 中为用户显示加载并轮询结果?

c# - 客户端与服务器端之间兼容的加密库(JavaScript -> C# 或 Java)

c# - 线程执行后调用委托(delegate)

java - 如何暂停所有正在运行的线程?然后恢复?

python - RQ 超时不会终止多线程作业

c# - WinApp 窗体在 Load 事件期间加载过多数据

c# - NancyFx - 如何处置在应用程序容器中注册为单例的实例?

c# - 正则表达式有问题