进程未完成时,后台对象触发“ RunWorkerCompleted”事件

时间:2018-12-31 01:52:14

标签: c# foreach async-await backgroundworker

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

(“ private async void”关键字用于Background DoWork事件,有一个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."); }

此代码尚未完成时,系统将“进程已结束”。发出此消息。

1 个答案:

答案 0 :(得分: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.");
}