【问题标题】:Task wrap a synchronisation process isn't awaited不等待任务包装同步过程
【发布时间】:2019-04-09 22:19:30
【问题描述】:

我的应用程序 WPF MVVM 将文件(几乎 10000 个文件)加载到一个文件夹中。 ProgressExplorerValue 是进度条的值。

public async Task ChargeFolderAsync()
{
    IsTaskConversionFinish = false;
    var rs = await Task.Run(() => LoadEntriesInFolder());
    IsTaskConversionFinish = true;
    ProgressExplorerValue = 0;
}

public IEnumerable<Record> LoadEntriesInFolder()
 {
     var rs = new List<Record>();
     var di = new DirectoryInfo(InitPath).EnumerateFiles();
     double factorPercent = di.Count() == 0 ? 0 : 100d / di.Count();            

     foreach (var file in di)
     {
         Record rc = new Record()
         {
             MetaName = file.Name,
             MetaPath = file.FullName
         };
         rs.Add(rc);
         ProgressExplorerValue += factorPercent;
     }
     return rs;
 }

任务不在await Task.Run(() =&gt; LoadEntriesInFolder()); 行等待。当我调试时,它会从这一行跳到下一行,即使方法LoadEntriesInFolder 尚未完成。

【问题讨论】:

  • EnumerateFiles() 之后添加ToList()。这可能是枚举问题
  • OP 似乎在 LoadEntriesInFolder() 方法中迭代 di
  • @AntoineV:你是说rs没有添加记录? InitPath 是否包含任何内容?
  • @mm8 绝对确定 InitPath 正确,里面有很多文件
  • @AntoineV:你有没有在调试器中通过LoadEntriesInFolder()?或者你怎么知道在IsTaskConversionFinishChargeFolderAsync() 中设置为true 之前它不会返回?

标签: c# wpf mvvm async-await


【解决方案1】:

做的时候
await Task.Run(() =&gt; LoadEntriesInFolder());
您正在等待 Run(); 方法的返回值,直到任务完成。
试试
Task.Run(() =&gt; LoadEntriesInFolder()).Wait();

【讨论】:

  • 未测试,但我认为它没有任何改变
【解决方案2】:

如何调用 ChargeFolderAsync 方法?我在 program.cs 中调用它,如下所示。

static void Main(string[] args)
{
    new FileLoader().ChargeFolderAsync().GetAwaiter().GetResult();
    Console.ReadLine();
}

并在您的异步方法中添加控制台日志。

Console.WriteLine(ProgressExplorerValue);

它给出了这个输出。

我认为这是您想要的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2012-04-15
    • 1970-01-01
    • 2013-09-16
    • 2014-03-18
    • 2014-09-06
    • 2015-07-13
    • 2013-02-10
    相关资源
    最近更新 更多