【发布时间】:2013-07-31 11:51:25
【问题描述】:
出于好奇,我正在尝试获取一些简单的async/await 代码以在 .NET 3.5 客户端配置文件下编译:
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 不支持此语言功能,如以下编译错误所示:
无法找到
async修饰符所需的所有类型。您是针对错误的框架版本还是缺少对程序集的引用?
我也知道 NuGet package Microsoft.Bcl.Async,它不支持 .NET 3.5。
问题:编译async代码所需的类型和类型成员的最小集合是什么?这个最小集合是否正式记录?如果是这样,在哪里? (请注意,我只对成功编译感兴趣,而不是执行。)
到目前为止我的收获:
我一直在尝试通过实验找到这个最小的类型集,这似乎是可能的,因为编译器报告需要,但缺少一个一个类型:
预定义类型
System.Runtime.CompilerServices.IAsyncStateMachine未定义或导入。
根据 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# .net-3.5 async-await infrastructure