C#任务.WhenAll未触发下一个任务

本文关键字:任务 下一个 WhenAll | 更新日期: 2023-09-27 18:26:13

我是多任务处理的新手,但我正在努力学习这一切是如何工作的。我有下面的代码,我认为它将创建一个任务并运行performInitialLoad方法,当它完成时,将启动initializeDataHarvester方法。performInitialLoad工作得很好,它确实到达了方法的底部,因为我可以在控制台中看到文本"Initial tag data load complete"。但它似乎从未启动initializeDataHarvester方法。有什么想法吗?

private void mainTaskLoader() {
     Task initialLoad = new Task(performInitialTagLoad);
     initialLoad.Start();
     Task dataHarvester = new Task(() => {
          Task.WhenAll(initialLoad);
     }).ContinueWith(t => initializeDataHarvester());         
}
private void performInitialTagLoad() {
   allTags = globals.getTags();
   foreach (KeyValuePair<String, String> tag in allTags) {
       try {
           globals.insertUpdateHarvesterData(tag.Key.ToString(), commObject.Read(tag.Value.ToString()));
       } catch (Exception e) {
           Console.WriteLine("Error on initial load: " + e.Message, true);                    
       }
   }
   Console.WriteLine("Initial tag data load complete");         
}
private void initializeDataHarvester() {
        Console.WriteLine("Got here!");            
}

C#任务.WhenAll未触发下一个任务

Task.WhenAll立即返回,但它返回一个任务,该任务将在任务完成时完成。你现在忽略了这个返回值。您也没有启动调用WhenAll的任务,这就是为什么该任务永远不会完成的原因。

你可以使用:

Task.WhenAll(initialLoad).ContinueWith(...);

但更好的是,您可以完全避免使用WhenAll,因为您无论如何都只有一个任务。

您还应该:

  • 了解async/await,它使的许多事情变得更容易
  • 开始遵循.NET命名约定

使用async/await,此代码将类似于:

private async Task MainTaskLoader()
{
    await Task.Run(PerformInitialTagLoad);
    InitializeDataHarvester();
}

如果你真的有多个东西要运行,你可以使用:

private async Task MainTaskLoader()
{
    var task1 = Task.Run(PerformInitialTagLoad);
    var task2 = Task.Run(SomethingElse);
    // Imagine we have many of these...
    await Task.WhenAll(task1, task2);
    InitializeDataHarvester();
}

理想情况下,您也应该使PerformInitialTagLoad成为一个异步方法,请注意,这也需要使插入异步。