出於好奇,我試圖得到一些簡單的async
/await
代碼在.NET 3.5客戶端配置文件進行編譯:編譯`async`代碼所需的最小類型集是多少?
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的支持。
問題:是什麼類型的需要&類型成員async
代碼編譯最小集合?正式記錄了這個最小集合嗎?如果是的話,在哪裏? (請注意,我只是在成功編譯,執行不感興趣。)
到目前爲止,我已經得到了什麼:
我一直試圖找到這組最小的類型實驗中,這似乎因爲需要編譯器報告是可能的,但缺少的類型逐一:
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
有很多成員,但是編譯器並不準確報告它需要的成員;它只是報告整個類型。因此,我可能會重現更多的類型定義,而不是實際需要的。
感謝。你是否自己發現了列表中的類型,或者你是否從官方文檔中獲取了列表? - 也感謝Eduasync鏈接,我已經開始閱讀這些博客文章。 – stakx
@stakx:那麼我最初建立了列表,因爲我沿着它走了並實現了Eduasync的一些部分 - 但現在我回頭看看編譯器在生成的代碼中使用的類型。 –