【问题标题】:Wait until a background worker is completed without locking out the main thread等到后台工作人员完成而不锁定主线程
【发布时间】:2014-04-21 18:57:26
【问题描述】:

我正在尝试让一个后台工作人员在主线程中运行一个微调器,我想等到后台工作人员完成。目前我可以有一个或另一个。我尝试使用自动重置事件,但它锁定了主线程,因此不显示微调器。是否有类似于自动重置事件的东西不会锁定主 UI。

这是我的一些代码

BackgroundWorker _bWorker = new BackgroundWorker();
_bWorker.DoWork += _bWorker_DoWork ;
_bWorker.RunWorkerCompleted += _bWorker_RunWorkerCompleted;

AutoResetEvent are = new AutoResetEvent(false);

_bWorker.RunWorkerAsync();

// Wait here until the background worker is finished
are.WaitOne();

...

private void _bWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Show spinner
    WaitSpinnerAdornerText = "Working";
    IsWaitSpinnerVisible = true;

    ...

    are.Set();
}


private void _bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    IsWaitSpinnerVisible = false;
    ...
}

有什么想法吗?欢迎任何帮助!提前致谢。

【问题讨论】:

  • 您使用的是哪个版本的 .net?
  • 尝试将 are.Set() 移到 Completed
  • @Sriram 我正在使用 .NET 4.0

标签: wpf .net-4.0 thread-safety backgroundworker autoresetevent


【解决方案1】:

使用BackgroundWorker 的全部意义在于您不必“等待”它完成。只需删除AutoResetEvent 并触发当前驻留在_RunWorkerCompletedRunWorkerAsync 之后的任何逻辑。

或者,您可以考虑使用任务并行库并将该代码作为延续运行。

最后,您可以考虑使用 .net 4.0 的 Async CTP,其中 async/await 功能的行为几乎与您想要编写代码的方式相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多