等到后台工作程序完成而不锁定主线程

时间:2014-04-21 18:57:26

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

我试图让后台工作程序在主线程中运行一个微调器运行,我想等到后台工作程序完成。目前我可以有一个或另一个。我已尝试使用自动重置事件,但锁定主线程因此不显示微调器。是否有类似于自动重置事件,不会锁定主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;
    ...
}

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

1 个答案:

答案 0 :(得分:2)

使用BackgroundWorker的重点是你不要“等待”它完成。只需删除AutoResetEvent并触发当前位于RunWorkerAsync _RunWorkerCompleted之后的任何逻辑。

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

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