2016-06-30 219 views
-1

例如之間的區別,也正是這一代碼之間的區別:這一個是什麼異步任務和任務

public async Task DoSomething(int aqq) 
{ 
    await DoAnotherThingAsync(aqq); 
} 

public Task DoSomething(int aqq) 
{ 
    DoAnotherThingAsync(aqq); 
} 

是它們都正確嗎?

+0

在異步工作方式我這個標記爲重複。另一個問題與你的完全不同,但答案也適用。 – Luaan

回答

0

如果使用得當,兩個簽名都是正確的。

async Task允許您在方法中使用await關鍵字。第一個例子完全正確。

第二個例子缺少return語句:

public Task DoSomething(int aqq) 
{ 
    return DoAnotherThingAsync(aqq); 
} 

與第二簽名去,你不能用等待的關鍵字,但你仍然可以返回一些任務,您從somwhere別的,比如得了,Task.FromResult(true);

給你另外一個區別考慮例如:

public async Task DoSomething1(int aqq) 
{ 
    await DoAnotherThingAsync(aqq); //blocks here and wait DoAnotherThingAsync to respond 
    SomethingElse(); 
} 


public Task DoSomething2(int aqq) 
{ 
    var task = DoAnotherThingAsync(aqq); //keep going here, not waiting for anything 
    SomethingElse(); 
    return task; 
} 

public async Task DoAnotherThingAsync(int aqq) 
{ 
    await Task.Delay(100); 
} 

public void SomethingElse() 
{ 
    //do something 
} 

如果您正在使用異步/等待你實際上是在等待塔斯k完成。返回任務不會等待任務完成。

0

在您的示例中,沒有。你的第二種方法打破了任務鏈,這是完全錯誤的,會導致很難找到整體錯誤和怪異行爲。

您需要返回如果您不使用async(它將自動處理您的退貨),那麼該任務。

還有一些細微的差異,這些差異在調試和其他一些陷阱時很重要,但這是一個相當廣泛的話題:)直到你完全理解了這個問題,才使用異步並等待 - 它們是C#在此刻。

-2

是的,他們都糾正,但其次是更好。

異步關鍵字只是一個可以讓我們編寫線性代碼而不是奇怪風格的手動處理任務的合成糖。

第一個變體被編譯到狀態機中,結果是它比第二個變體需要多一點時間。您甚至可以將第一個變體重寫爲return Task.Run(() => DoAnotherThingAsync(aqq).Result)以瞭解區別在哪裏。注意:這只是一個想法,相反,重寫第一種方法更爲複雜。我只想告訴你,你的變體不相似。

你可以閱讀一下這篇文章"Async Await and the Generated StateMachine"

+0

你是對的,第一個案例將被重寫成一個狀態機,並且它有成本(當然,如果你正在處理真正的I/O代碼,這個成本很可能是微不足道的,重新嘗試做,但沒關係)。然而,使用'Task.Run'和'await'沒有什麼相似之處,這完全是誤導。要麼澄清你想說什麼,要麼擺脫索賠。 – Luaan

+0

@Luaan是的,你是對的。增加了澄清,以防止誤導。 –