C# “背景对象触发器”;RunWorkerCompleted“已完成”;进程未完成时的事件
当我的后台工作对象中的foreach循环刚刚返回1次时,我的后台工作对象触发“RunWorkerCompleted”事件,无论该循环在该触发后旋转多长时间,都不会再次触发它(我指的是当前会话)。他为什么那样做?如何修复它 (“private async void”关键字用于后台DoWork事件,有一个foreach循环,该循环中有一个由“await”触发的方法。) 一个例子C# “背景对象触发器”;RunWorkerCompleted“已完成”;进程未完成时的事件,c#,foreach,async-await,backgroundworker,C#,Foreach,Async Await,Backgroundworker,当我的后台工作对象中的foreach循环刚刚返回1次时,我的后台工作对象触发“RunWorkerCompleted”事件,无论该循环在该触发后旋转多长时间,都不会再次触发它(我指的是当前会话)。他为什么那样做?如何修复它 (“private async void”关键字用于后台DoWork事件,有一个foreach循环,该循环中有一个由“await”触发的方法。) 一个例子 private async void bgwCheckFiles_DoWork(object sender, DoWork
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."); }
当此代码尚未完成时,系统将“进程结束”。给出此消息。因为您使用的是
异步void
方法,该方法的执行在第一次阻塞wait
时结束,这意味着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.");
}
private async void
err,我对此感到很抱歉。。不管怎样,是否有代码片段?@BagusTesa,已编辑。从BackGroundWorker的DoWork
事件中删除任何async/await
内容。感谢您的回答!:)我创建了一个类似于您的示例的任务块,并用button click事件触发。它工作得很好,不需要背景工作人员。再次感谢你!:)