pza*_*zaj 0 c# asynchronous task-parallel-library async-await
我正在努力让我的任务运行.我相信他们没有开始,等待永远不会回来,这样我的应用程序永远不会进一步运行.它意味着处理多个数据集(在执行时已知),因此我使用循环添加它们,它看起来像这样:
foreach(IGrouping<enumType, Item> group in lp)
{
Task<ProcessedItem> t = new Task<ProcessedItem>(
() => ProcessItems(group.ToList(), group.Key));
tasks.Add(t);
}
await Task.WhenAll(tasks);
(...)
Run Code Online (Sandbox Code Playgroud)
它停在Task.WhenAll.我认为它们根本没有启动,我在另一个方法中有类似的代码,但是我将函数直接传递给任务:
Task<ReturnType>(Func);
Run Code Online (Sandbox Code Playgroud)
我认为这导致了差异,由于参数的原因,我无法通过这种方式传递它.我应该如何修改我的代码才能使其正常工作?我应该明确地开始每项任务吗?如果任务在await之前完成,那么不会破坏await关键字吗?
我认为他们根本没有开始
你当然是正确的.new Task()返回一个"冷任务",这是一个尚未开始明确调用Task.Start()它的任务.文档清楚地说明了这一点:
而不是调用此构造函数,实例化Task对象并启动任务的最常用方法是调用static
Task.Run(Action)或TaskFactory.StartNew(Action)method.此构造函数提供的唯一优势是它允许将对象实例化与任务调用分开.
这就是为什么你不应该使用Task构造函数,而是使用工厂方法的原因之一,它为你提供了一个已经启动的"热门任务" .在这里,Task.Run是适当的:
var tasks = lp.Select(group => Task.Run(() => ProcessItems(group.ToList(), group.Key)));
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)