出于好奇,我正在尝试获取一些简单的 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#编译器方面,你还需要:
-
AsyncTaskMethodBuilder
-
AsyncTaskMethodBuilder<TResult>
-
AsyncVoidMethodBuilder
-
AsyncStateMachineAttribute
- 可能
ICriticalNotifyCompletion
尽管我相信那只是建筑商使用的。
我不希望 TaskCreationOptions
或 CancellationToken
实际上是必需的 - 我想不出它们会在生成的代码中的什么地方使用。
但从根本上说,您确实需要整个 TPL 支持才能工作 - 只是让它编译 不会为您做这件事。如果你只是出于好奇而对此感兴趣,那就另当别论了。你可能对我的 Eduasync 感兴趣博客系列,这是让编译器的 CTP 版本在没有 AsyncCtpLibrary.dll
的情况下工作的粗略版本程序集(针对 .NET 4.0)- 基本上提供所有相关类型。
source code不会针对 C# 5 编译器工作,因为最终版本的情况有所改变,但大多数概念保持不变。
关于c# - 编译 `async` 代码所需的最少类型集是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969603/