【问题标题】:What happens when you create a Task?创建任务时会发生什么?
【发布时间】:2015-12-22 12:19:57
【问题描述】:
public MyClass foo(int parameter)
{
    var foo = new Task<MyClass>(() => bar(parameter));

    try 
    {
        return foo.Result;
    }
}

当我创建 new Task 时,线程方面会发生什么。

这意味着新线程(B) 开始评估bar(parameter),当主线程(A) 转到foo.Result; 时,它们会等到B 完成并返回Result

【问题讨论】:

  • 网络上有大量关于任务的文档。尝试搜索。 :)
  • 什么也没发生。 blog.stephencleary.com/2014/05/…
  • @Vadim 天哪,这是一篇糟糕的文章。 “[Tasks] 支持一段代码在并行处理器中运行。它只是简单地将线程生成到多个进程中” - 嗯...
  • "当我创建一个新的Task 时,线程会发生什么?"没有。新的Task 对象被创建为非活动状态。如果您不对foo 对象执行任何其他操作,则永远不会调用bar

标签: c# multithreading


【解决方案1】:

来自here

由其公共构造函数创建的任务被称为“冷” 任务,因为它们在非计划中开始其生命周期 TaskStatus.Created 状态,直到在这些上调用 Start 他们进展到被安排的实例

因此,不会启动“线程 B”(此外,在一般情况下,“start new task”!= “start new thread”)。

当主线程(A)进入 foo.Result;他们等到 B 完成并返回 Result?

由于没有“线程 B”,线程 A 将永远等待。

【讨论】:

  • 所以我需要调用foo.Start() == 开始评估bar。当它完成时,我们将返回foo.Result
  • 要么调用Start,要么创建新的“热”任务(使用Task.Run)而不是“冷”任务。创建冷任务必须有一个重要的原因。
  • 你能解释一下为什么我没有Run 方法,只有RunSynchronouslyStartWait 和其他...?
  • 是的,你是对的。 Task.Run 用于创建新任务,foo.Start 用于启动创建的“冷”任务。
  • msdn.microsoft.com/en-us/library/dd321468%28v=vs.110%29.aspx: "相当于调用Wait方法"。是什么阻止您阅读文档?
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
相关资源
最近更新 更多