【问题标题】:Why return type of async must be void, Task or Task<T>为什么异步的返回类型必须为 void、Task 或 Task<T>
【发布时间】:2011-10-24 01:33:38
【问题描述】:

我正在尝试使用异步 CTP,但我注意到编译器抱怨异步返回类型。其他类型有什么问题?

一个简单的演示

static void Main(string[] args)
{
    DoWork();
    Console.WriteLine("Returned to main");
    Console.Read();
}

// why do I need to return void, Task or Task<T> here?
// I know I can use something like Task<IEnumerable<string>>
private static async string[] DoWork()
{
    Console.WriteLine("DoWork started");
    return await Task.Factory.StartNew(
        delegate
        {
            Thread.Sleep(2000);                
            Console.WriteLine("DoWork done");
            return new List<string>();
        });        
}

【问题讨论】:

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


    【解决方案1】:

    await [消费] 方面,我们很灵活:我们可以等待任何类型,只要它 有正确的方法。

    async 方法 [生产] 方面,我们不灵活:我们被硬编码为 仅返回 Task 类型(或 void)。 为什么不一致?

    1. 迭代器已经有这种行为...

      一个迭代器方法(里面有一个“yield”)被硬编码为返回 IEnumerable 或 IEnumerator。 但是,您可以“foreach”任何具有 GetEnumerator/MoveNext/当前成员。 所以 Async 只是跟随套件。

    2. 任务就像一个未来,所以最好硬编码......

      任务只是一个未来。 未来是语言/平台的基本组成部分。 两种语言没有理由拥有这样一个基础的多个副本 概念。一个就够了。它是如此基础,您甚至可以将关键字添加到 处理期货的语言。 无论如何,如果有人有类似未来的东西,或者更丰富的任务概念,那么他们可以 从 Task 或 Func 构建它。 (我们的任务已经在运行。如果你想构建一些“冷”的东西,比如 F# asyncs 或类似 IObservable,在您告诉它之前不会启动 - 那么您应该 从 Func 而不是 Task 构建它)。

    3. 更多细节

      定义这个函数:

      void f<T>(Func<Task<T>> f)
      

      并调用它:

      f( () => 1 + await t )
      

      在这种情况下,我们希望能够推断出 T=int。这样的推断是不可能的,除非 编译器具有硬编码知识,它传递给“f”的 lambda 具有类型 Task&lt;int&gt;.

    来源:Technical intro to the Async CTP

    【讨论】:

      【解决方案2】:

      因为Task&lt;TResult&gt; 是一个“未来”——一个稍后会出现的值。 string[] 是您现在拥有的东西。

      同样,Task 是一个将在未来某个时间完成(成功或出错)的操作。

      void 是一种特殊情况;它代表 Async CTP 中的顶级操作。

      如果您想知道为什么不自动推断 Task,Async CTP 团队已经考虑过但拒绝了。他们的理由是herethis thread 也涵盖了它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多