Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “背景对象触发器”;RunWorkerCompleted“已完成”;进程未完成时的事件_C#_Foreach_Async Await_Backgroundworker - Fatal编程技术网

C# “背景对象触发器”;RunWorkerCompleted“已完成”;进程未完成时的事件

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

当我的后台工作对象中的foreach循环刚刚返回1次时,我的后台工作对象触发“RunWorkerCompleted”事件,无论该循环在该触发后旋转多长时间,都不会再次触发它(我指的是当前会话)。他为什么那样做?如何修复它

(“private async void”关键字用于后台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."); }

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

因为您使用的是
异步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事件触发。它工作得很好,不需要背景工作人员。再次感谢你!:)