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!");
}
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
成为一个异步方法,请注意,这也需要使插入异步。