【问题标题】:Background Object Triggers "RunWorkerCompleted" event When Process Not Finished进程未完成时,后台对象触发“RunWorkerCompleted”事件
【发布时间】:2018-12-31 01:52:13
【问题描述】:

当其中的 foreach 循环刚刚返回 1 次时,我的 Background Worker 对象触发“RunWorkerCompleted”事件,无论该触发后循环旋转多长时间,都不会再次触发它(我说的是当前会话) .他为什么这样做?如何解决?

(后台DoWork事件使用“private async void”关键字,有一个foreach循环,该循环中有一个由“await”触发的方法。)

一个例子;

private async void bgwCheckFiles_DoWork(object sender, DoWorkEventArgs e)
{
    string a;
    foreach (string s in lblist.Items) { a = await getMD5HashFromFile2(s); }
}

private void bgwCheckFiles_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ MessageBox.Show("Process ended."); }

当这段代码还没有完成时,系统是“进程结束”。给出这个消息。

【问题讨论】:

  • private async void err,我对此感到难过.. 无论如何,任何代码 sn-p we can try to fiddle with
  • @BagusTesa,已编辑。
  • 从 BackGroundWorker 的 DoWork 事件中删除任何 async/await 内容。

标签: c# foreach async-await backgroundworker


【解决方案1】:

因为您使用的是async void 方法,所以该方法的执行在第一个阻塞await 处结束,这意味着BackgroundWorker 的工作被认为已完成。

如果您已经在使用异步 API,则不需要 BackgroundWorker。你只需要这样的东西:

private async Task GetMD5HashFromFilesAsync()
{
    foreach (string s in lblist.Items)
    {
        await getMD5HashFromFile2(s).ConfigureAwait(false);
    }
}

并且,假设您从事件处理程序中调用它:

private async void bgwCheckFiles_RunWorkerCompleted(object sender, EventArgs e)
{
    await GetMD5HashFromFilesAsync();
    MessageBox.Show("Process ended.");
}

【讨论】:

  • 感谢您的回答! :) 我像您的示例一样创建了一个任务块,并通过按钮单击事件触发。它工作得很好,不需要后台工作人员。再次感谢你! :)
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
相关资源
最近更新 更多