我正在尝试这段代码(只是生成一些任务并模拟工作):
var tasks = Enumerable.Range(1, 10).Select(d => Task.Factory.StartNew(() =>
{
Console.Out.WriteLine("Processing [{0}]", d);
Task.Delay(20000).Wait(); // Simulate work. Here will be some web service calls taking 7/8+ seconds.
Console.Out.WriteLine("Task Complete [{0}]", d);
return (2 * d).ToString();
})).ToList();
var results = Task.WhenAll(tasks).Result;
Console.Out.WriteLine("All processing were complete with results: {0}", string.Join("|", results));
我期待在控制台中一次看到 10 个 Processing ...
;但是当我运行时,最初我看到这个输出
Processing [1]
Processing [2]
Processing [3]
Processing [4]
然后1/2秒后,Processing [5]
,Processing [6]
等依次缓慢显示。
你能解释一下吗?这是否意味着任务正在延迟启动?为什么?
最佳答案
如另一个答案中所述,使用 TaskCreationOptions.LongRunning
将解决您的问题。
但这不是您解决问题的方式。您的示例模拟了 CPU bound 工作。您说您的任务将调用 Web 服务 - 这意味着它们将 IO 绑定(bind)。
因此,它们应该异步运行。但是,Task.Delay(20000).Wait();
同步 等待,因此它并不代表将/应该实际进行的操作。
改用这个例子:
var tasks = Enumerable.Range(1, 10).Select(async d =>
{
Console.Out.WriteLine("Processing [{0}]", d);
await Task.Delay(5000); // Simulate IO work. Here will be some web service calls taking 7/8+ seconds.
Console.Out.WriteLine("Task Complete [{0}]", d);
return (2*d).ToString();
}).ToList();
var results = Task.WhenAll(tasks).Result;
Console.Out.WriteLine("All processing were complete with results: {0}", string.Join("|", results));
所有任务都按预期立即开始。
关于c# - 为什么这些任务开始延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888053/