【问题标题】:await Task.Factory.StartNew(() => versus Task.Start; await Task;await Task.Factory.StartNew(() => 与 Task.Start; await Task;
【发布时间】:2013-06-04 18:49:53
【问题描述】:

这两种使用 await 的形式有什么功能上的区别吗?

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
    
  2. Task<string> myTask = new Task<string>(() => GetAnimal("feline"));
    myTask.Start();
    string z = await myTask;
    

具体来说,1.中每个操作的调用顺序是什么?是先调用 StartNew,然后调用 await,还是先调用 1.?

【问题讨论】:

    标签: c# async-await c#-5.0


    【解决方案1】:

    当您使用asyncawait 编写代码时,应尽可能使用Task.Run

    Task 构造函数(和Task.Start)是来自任务并行库的保留,用于创建尚未启动的任务。 Task 构造函数和Task.Start 不应在async 代码中使用。

    同样,TaskFactory.StartNew 是一种较旧的方法,它不使用async 任务的最佳默认值,也不理解async lambdas。它在少数情况下很有用,但大多数情况下Task.Run 更适合async 代码。

    【讨论】:

    • 这是更好的方法吗? ...delegate string AnimalDelegate(string t);AnimalDelegate a = new AnimalDelegate(GetAnimal);var result = await Task.Run(() =&gt; { return a("feline"); });
    • 你可以说var result = await Task.Run(() =&gt; GetAnimal("feline"));
    【解决方案2】:

    StartNew 只是一个short hand for creating and starting a task。如果您想在启动 Task 实例之前对其进行操作,请使用构造函数。如果您只想立即创建和启动任务,请使用简写。

    StartNew 的文档说:

    调用 StartNew 在功能上等同于通过 使用其构造函数之一,然后调用 Task.Start 方法 安排任务执行。

    【讨论】:

    • 在调用 myTask.Start() 时,会立即调用 GetAnimal("feline"),这是有道理的,因为我启动了任务。这是否意味着我可以立即启动多个任务,然后再决定何时为每个任务调用 await?
    • @user42:当然。 (但我不会说调用另一个线程是完全“立即的”。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2013-09-04
    相关资源
    最近更新 更多