首先,我确定这已经在某个地方找到了答案,但是我找不到它。
我正在任务中运行并行的foreach,并且它直到所有任务完成都没有等待。
我尝试放置Task.Wait();方法之后,但这没有帮助。我已经用Google搜索并查看了StackOverflow,但我无法弄清楚。看起来应该很简单,但我必须缺少一些东西。
var t = await Task.Run(() => Parallel.ForEach(SourceDestination, async s =>
{
bool bNeedsPassword = false;
success = ExtractReaderAPI(s.Source, s.Extension, out bNeedsPassword, s.Destination);
if (bNeedsPassword)
{
await AskForPasswordAsync(s.Source, s.Extension, s.Destination);
}
}));
DisplayMessage(m_resourceLoader.GetString("Finished"));
我从上面的代码段中删除了一堆代码,以缩短发布时间。但最重要的是,当它要求输入密码时,将显示“完成”消息。如何等待所有Parallel.ForEach任务完成,然后再移至“完成”消息?
谢谢。
编辑:尝试了重复文章中提到的几种方法后,我仍然无法实现我要实现的目标。
但是,正在发生的是“完成”对话框弹出,要求您输入文件密码的内容对话框前面。如果关闭“完成”对话框并输入密码,然后关闭密码对话框,则会打开文件。因此,辅助线程会等待输入密码,但是在此之前,我所有的任务都标记为已完成,并且程序在UI线程上继续执行。
我认为问题是当我等待AskForPasswordAsync方法时,该任务被标记为已完成。我有权利吗?
我正确地解决了这个问题,还是应该使用其他方法?
Edit2:我刚刚解决了问题
while(m_iThreadCounter > 0)
await Task.Factory.StartNew( () => Task.Delay(5).Wait());
workingProgressRing.IsActive = false;
DisplayMessage(m_resourceLoader.GetString("Finished"));
我有一个全局变量,该变量跟踪正在运行的线程数,因此只要它大于0,仍然有正在运行的任务。当控制权移入线程方法时,任务数会增加。该方法完成后,或者当控制移入线程方法中的catch块时,运行的线程数将减少。
哇,好简单。