亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#中的異步/等待機制

C#中的異步/等待機制

C#
qq_遁去的一_1 2022-11-21 21:50:57
我有2個問題想問。我在 Microsoft 文檔中讀過這段關于 async/await 的內容。但是我沒看清楚。https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model#BKMK_APIAsyncMethods“如果 GetStringAsync(以及 getStringTask)在 AccessTheWebAsync 等待它之前完成,則控制權保留在 AccessTheWebAsync 中。如果被調用的異步進程 (getStringTask) 已經完成并且 AccessTheWebSync 不必等待,則暫停然后返回到 AccessTheWebAsync 的費用將被浪費為了最終的結果。”你能解釋一下嗎?正如我所讀,當您在 C# 中使用 async/await 時,代碼不會在兩個單獨的線程中運行。它仍然在同步上下文中,但它會在遇到“await”關鍵字的情況下返回 Task 作為在完成之前返回結果的承諾。如果任務在“等待”之前完成,現在與同步相同。沒有區別。即使從調用方方法切換到“AccessTheWebAsync”方法(反之亦然)的成本也很高。抱歉,這是我第一次在 StackOverflow 上提問。
查看完整描述

2 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

鑒于功能:


async Task<int> AccessTheWebAsync()  

{   

    // You need to add a reference to System.Net.Http to declare client.  

    using (HttpClient client = new HttpClient())  

    {  

        Task<string> getStringTask = client.GetStringAsync("https://learn.microsoft.com");  


        DoIndependentWork();  


        string urlContents = await getStringTask;  


        return urlContents.Length;  

    }  

}   

當執行到


string urlContents = await getStringTask; 

執行可以做兩件事之一:

  1. 如果 GetStringAsync() 已經完成,則繼續執行下一行(return urlContents.Length;)

  2. 如果 GetStringAsync() 尚未完成,則 AccessTheWebAsync() 的執行將暫停并返回到調用函數,直到 GetStringAsync() 完成。您詢問的段落說明如果我們無論如何都暫停了 AccessTheWebAsync() 的執行,那么暫停然后返回到 AccessTheWebAsync 的費用將被浪費。 因此這不會發生,因為它足夠聰明,知道什么時候暫停執行,什么時候不暫停執行。


查看完整回答
反對 回復 2022-11-21
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

C# 中的異步方法必須始終返回一個任務,如下所示:


public async Task method();

public async Task<bool> asyncMethod();

當它不返回任何東西時,void 就返回Task,在任何其他情況下Task<returntype>


當你調用異步方法時,你可以做三件事:


// Result is now of type Task<object> and will run async with any code beyond this line.

// So using result in the code might result in it still being null or false.

var result = asyncMethod();


// Result is now type object, and any code below this line will wait for this to be executed.

// However the method that contains this code, must now also be async.

var result = await asyncMethod();


// Result is now type Task<object>, but result is bool, any code below this line will wait.

// The method with this code does not require to be async.

var result = asyncMethod().Result;

所以來回答你的問題。


考慮執行代碼的結果是否在代碼的其他地方使用,因為如果你不等待它,結果將被浪費,因為它仍然是 null。


反之亦然,當等待一個不會返回任何東西的方法時,通常不需要等待。


查看完整回答
反對 回復 2022-11-21
  • 2 回答
  • 0 關注
  • 110 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號