不等待任务包装同步过程

时间:2018-11-06 13:53:31

标签: c# wpf mvvm async-await

我的应用程序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(() => LoadEntriesInFolder());行不等待任务。当我调试时,即使方法LoadEntriesInFolder尚未完成,它也可以从该行跳至下一行而不会中断。

2 个答案:

答案 0 :(得分:0)

您如何调用ChargeFolderAsync方法?我在如下的program.cs中称呼它。

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

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

Console.WriteLine(ProgressExplorerValue);

它给出了这个输出。

enter image description here

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

答案 1 :(得分:-5)

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