簡體   English   中英

在C#5.0中將方法標記為異步有什么后果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM