c# - 为什么这些任务开始延迟?

标签 c# multithreading task

我正在尝试这段代码(只是生成一些任务并模拟工作):

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/

相关文章:

java - 每天、每周、每月、每年调用一个方法

Javascript 函数不是从按钮单击后面的代码调用的

c# - 有没有一种方法可以像在 eclipse 中那样在 visual studio 2012 中生成 getter、setter 函数

c# - WPF - 尝试在任务中打开一个新窗口但收到 "The calling thread must be STA exception"

python - 在哪里加入在异步 Tornado 请求处理程序中创建的线程?

multithreading - Perl 线程 : share GLOB between threads

c++ - 线程安全和 `const`

python - Google App Engine 任务队列如何工作?

c# - 插入新实例时不执行 Entity Framework 核心延迟加载

variables - 如何使用 TFS 构建有条件地跳过或执行任务/步骤?