【发布时间】:2016-03-10 19:35:07
【问题描述】:
我正在尝试这段代码(只是生成一些任务并模拟工作):
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通知调度程序这一事实 -
@Damien_The_Unbeliever 哇!刚刚使用了那个重载,ta-da!
-
@Damien_The_Unbeliever 你能发表你的评论作为答案吗(这样我就可以将其标记为已回答)?
-
发生这种情况的原因是因为默认情况下任务是使用线程池调度的,当线程池线程创建超过
ThreadPool.GetMinThreads()给出的计数时会受到限制。长时间运行的线程没有安排在线程池中,因此它们不会出现这种行为。 -
现在还有一个问题,我应该使用
TaskCreationOptions.LongRunning选项创建哪个Tasks? >500 毫秒?
标签: c# multithreading task