如何检查多个BackgroundWorkers是否已编译其任务

时间:2014-03-15 03:32:21

标签: c# multithreading

我有三个BackgroundWorkers,每个查询数据库的db。我想知道如何检查所有三个BackgroundWorkers是否已完成他们的工作,以便我可以执行一些逻辑?

这是我到目前为止所做的,但它标志着一个错误说 - 'await'运算符只能在异步方法中使用。考虑使用'async'修饰符标记此方法并将其返回类型更改为'Task'。

public void WaitForThreadsToComplete(Object _Item) 
{
    var results = await Task.WhenAll(
        Task.Run(() => InitiateBackgroundProcessElements(_Item.Id)),
        Task.Run(() => InitiateBackgroundProcessCompulsoryField(_Item.Id)),
        Task.Run(() => InitiateBackgroundProcessFieldRange(_Item.Id)));

    // my logic here
}

2 个答案:

答案 0 :(得分:2)

再看一下你的错误:

  

等待'运算符只能在异步方法中使用。考虑使用' async'标记此方法。修饰符并将其返回类型更改为'任务'。

然后执行错误消息要执行的操作:

public async Task WaitForThreadsToCompleteAsync(Object _Item) 
{
  var results = await Task.WhenAll(
    Task.Run(() => InitiateBackgroundProcessElements(_Item.Id)),
    Task.Run(() => InitiateBackgroundProcessCompulsoryField(_Item.Id)),
    Task.Run(() => InitiateBackgroundProcessFieldRange(_Item.Id)));

  // my logic here
}

我还为您的方法名称添加了Async后缀,因此它跟在TAP guidelines之后。

答案 1 :(得分:0)

您可以使用RunWorkerCompleted事件来识别此信息。

试试这个:

BackgroundWorker bg1 = new BackgroundWorker();      
bg1.DoWork+=bg1_DoWork;    
bg1.RunWorkerAsync();  //start the worker
bg1.RunWorkerCompleted+=bg1_RunWorkerCompleted;


private void bg1_DoWork(object sender, DoWorkEventArgs e)
{
    /*Worker started - do something*/
}
private void bg1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    /*worker ended - do something*/
}