进程未完成时背景对象触发 "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.");
}
当其中的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.");
}