当它的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."); }
此代码尚未完成时,系统将“进程已结束”。发出此消息。
答案 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.");
}