进程未完成时背景对象触发 "RunWorkerCompleted" 事件

Background Object Triggers "RunWorkerCompleted" event When Process Not Finished

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

(Background 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."); }

当此代码尚未完成时,系统正在 "Process ended." 给出此消息。

因为您使用的是 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.");
}