C#等待异步循环完成不起作用

时间:2019-04-06 23:30:53

标签: c# task wait

首先,我确定这已经在某个地方找到了答案,但是我找不到它。

我正在任务中运行并行的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任务完成,然后再移至“完成”消息?

谢谢。

编辑:尝试了重复文章中提到的几种方法后,我仍然无法实现我要实现的目标。

  1. 我需要产生一堆线程来打开一堆文件。
  2. 如果这些文件之一受密码保护,则执行将移至catch块,在此将布尔值设置为true bPasswordNeeded。
  3. 在这种情况下,将调用一个方法来打开带有文本框的ContentDialog要求输入密码。这是一个异步任务
  4. 然后将密码传递给打开文件的方法。

但是,正在发生的是“完成”对话框弹出,要求您输入文件密码的内容对话框前面。如果关闭“完成”对话框并输入密码,然后关闭密码对话框,则会打开文件。因此,辅助线程会等待输入密码,但是在此之前,我所有的任务都标记为已完成,并且程序在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块时,运行的线程数将减少。

哇,好简单。

0 个答案:

没有答案