c# - 编译 `async` 代码所需的最少类型集是什么?

标签 c# .net-3.5 async-await infrastructure

出于好奇,我正在尝试获取一些简单的 async/await 代码以在 .NET 3.5 Client Profile 下编译:

async void AwaitFoo()
{
    await new Foo();
}

class Foo
{
    public IFooAwaiter GetAwaiter() { … }
}

interface IFooAwaiter : System.Runtime.CompilerServices.INotifyCompletion
{
    bool IsCompleted { get; }
    void GetResult();
}

我完全清楚 .NET 3.5 不支持此语言功能,如此编译错误所示:

Cannot find all types required by the async modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?

我也知道 NuGet package Microsoft.Bcl.Async ,它不支持 .NET 3.5。

问题编译异步代码所需的类型和类型成员的最小集合是什么?这个最小集合是否有正式记录?如果是这样,在哪里? (请注意,我只对编译成功感兴趣,对执行不感兴趣。)


到目前为止我得到了什么:

我一直试图通过实验找到这个最小的类型集,这似乎是可能的,因为编译器报告需要,但缺少一个一个的类型:

Predefined type System.Runtime.CompilerServices.IAsyncStateMachine is not defined or imported.

根据 MSDN 引用页定义报告的类型会导致报告下一个缺失的类型。我到目前为止:

  • System.Runtime.CompilerServices.IAsyncStateMachine
  • System.Runtime.CompilerServices.INotifyCompletion(上面的示例代码需要)
  • System.Threading.Tasks.CancellationToken(Task 需要)
  • System.Threading.Tasks.TaskCreationOptions(Task 需要)
  • System.Threading.Tasks.Task

此时我停止了,因为 Task 有很多成员,但编译器没有准确报告它需要哪些成员;它只是报告整个类型。因此,我可能会重现比实际需要的更多的类型定义。

最佳答案

在C#编译器方面,你还需要:

不希望 TaskCreationOptionsCancellationToken实际上是必需的 - 我想不出它们会在生成的代码中的什么地方使用。

但从根本上说,您确实需要整个 TPL 支持才能工作 - 只是让它编译 不会为您做这件事。如果你只是出于好奇而对此感兴趣,那就另当别论了。你可能对我的 Eduasync 感兴趣博客系列,这是让编译器的 CTP 版本在没有 AsyncCtpLibrary.dll 的情况下工作的粗略版本程序集(针对 .NET 4.0)- 基本上提供所有相关类型。

source code不会针对 C# 5 编译器工作,因为最终版本的情况有所改变,但大多数概念保持不变。

关于c# - 编译 `async` 代码所需的最少类型集是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969603/

相关文章:

wpf - 开发WPF或Silverlight应用程序的工具

javascript - 异步/等待返回结果不 promise

c# - ReSharper 向 .NET 2.0 项目发出 C# 3.0 代码检查警告

c# - 如何正确映射 WebAPI 路由

c# - FormatProvider vs. 扩展方法 vs. 新类

c# - 同步 2 个列表

c# - WPF 中的进度条 - 停留在 50%

javascript - 如何从 JavaScript 代码调用存储过程?

c# - 异步打开读取

c# - 异步串口读取的正确实现