[英]What are the consequences of marking a method async in C# 5.0?
據我了解,為了使用await
我必須處於標記為async
的方法內部。 如果是這種情況,我可以在任何Task<Thing>
上使用await
來某種程度上同步檢索Task
結果的值。
Task<bool> task = new Task<bool>(() => false);
task.Start();
int result = await task;
為此,我需要使用async
標記的方法。
我想請問這里是究竟是什么意思async
,什么是標記有方法的后果async
。
另外,這兩者之間有什么區別?
Task<bool> Foo() {
var task = new Task<bool>(() => false);
task.Start();
return task;
}
async Task<bool> Foo2() {
var task = new Task<bool>(() => false);
task.Start();
return await task;
}
我都可以在async
方法async
它們與await
一起使用。
var res1 = await Foo();
var res2 = await Foo2();
這是唯一的區別Foo2
可以利用await
在它的身上,而Foo
不能?
它只是警告編譯器該方法可能包含等待表達式。 這使它能夠對方法返回值進行一致性檢查。 並啟用內置於編譯器中的重寫邏輯,從而使該方法將方法轉換為隱藏類。
如果您實際上未在方法主體中使用await運算符,則無需進行這種重寫,也不需要async關鍵字。 如果仍然使用異步 ,則將收到一個警告消息(CS1998),指出您的代碼可能不是您打算編寫的內容。 一個很好的診斷。
async
關鍵字的主要目的是避免與C#5.0之前的代碼沖突。換句話說,我們可以說是為了保持Backword的兼容性。
此前C#5.0,你也可以使用標識符/類型的await
void Somemethod()
{
int await = 5;//identifier
await myAwait = new await();//type
}
上面的代碼在C#5.0之前是完全有效的(在C#5.0中也是有效的,除非並且直到您在async方法中使用它為止),如果在c#5.0中將await
作為reserved keyword
添加會發生什么? 您的代碼將無法編譯。 那將是一個巨大的變化。
因此,要保持選擇,使落后的兼容性語言設計者await
的上下文關鍵字。 因此,下一個問題出現await
將是一個contextual keyword
,但這里是什么背景?
好吧,這里有async
關鍵字, async
存在只是啟用了await
關鍵字。 並使編譯器也AsyncStateMachineAttribute
方法發出AsyncStateMachineAttribute
。
假設您已經知道或超出了問題的范圍,那么我沒有談論有關如何轉換async
方法的任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.