C Aysc Await 實現非同步程式設計

2021-07-12 06:17:25 字數 3023 閱讀 3016

廢話少說,直接上**

public mainwindow()

}

介面上只有乙個button和textbox,按下button後 程式將先進入「createmultipletasksasync」,然後再進入「processurl」,大家知道開啟網頁是需要時間的如果此時執行緒一直等待網頁的返回一定會有短暫的卡頓(執行緒阻塞),如果在方法前加了「async」即開始了非同步方法,當呼叫await 喚醒(期間執行緒是空閒的,你點滑鼠什麼的也會有響應),此時執行緒繼續執行方法。

關於await 微軟官方的解釋是:

await運算子在非同步方法應用於任務,以掛起執行方法,直到所等待的任務完成。這個任務表示正在進行的工作。

在其中使用await的非同步方法必須通過 async 關鍵字進行修改。

使用async修飾符定義並且通常包含乙個或多個await表示式的這類方法稱為非同步方法。

應用 await 運算子的任務通常是實現基於任務的非同步模式的方法呼叫的返回值。示例包括 task 或 task型別的值。

在以下**中,httpclient 方法 getbytearrayasync 返回 task(getcontentstask)。當任務完成時,任務約定生成實際位元組陣列。 await 運算子應用於 getcontentstask 以在 sumpagesizesasync 中掛起執行,直到 getcontentstask 完成。同時,控制權會返回給 sumpagesizesasync 的呼叫方。當 getcontentstask 完成之後,await 表示式計算為位元組陣列。

c#private async task sumpagesizesasync()

system_caps_important重要事項

如前面的示例中所示,如果 await 應用於返回 task的方法呼叫結果,則 await 表示式的型別為 tresult。如果 await 應用於返回 task 的方法呼叫結果,則 await 表示式的型別為 void。以下示例演示了差異。

c#// keyword await used with a method that returns a task.

tresult result = await asyncmethodthatreturnstasktresult();

// keyword await used with a method that returns a task.

await asyncmethodthatreturnstask();

await 表示式不阻止正在執行它的執行緒。而是使編譯器將剩下的非同步方法註冊為等待任務的延續任務。控制權隨後會返回給非同步方法的呼叫方。任務完成時,它會呼叫其延續任務,非同步方法的執行會在暫停的位置處恢復。

await 表示式只能在由 async 修飾符標記的立即封閉方法體、lambda 表示式或非同步方法中出現。術語「await」在該上下文中僅用作關鍵字。在其他位置,它會解釋為識別符號。在方法、lambda 表示式或匿名方法中,await 表示式不能在同步函式體、查詢表示式、lock 語句塊或不安全上下文中出現。

異常大多數非同步方法返回 task 或 task。返回任務的屬性攜帶有關其狀態和歷史記錄的資訊,如任務是否完成、非同步方法是否導致異常或已取消以及最終結果是什麼。 await 運算子可訪問這些屬性。

如果等待的任務返回非同步方法導致異常,則 await 運算子會重新引發異常。

如果等待的任務返回非同步方法取消,則 await 運算子會重新引發 operationcanceledexception。

處於故障狀態的單個任務可以反映多個異常。例如,任務可能是對 task.whenall 呼叫的結果。等待此類任務時,等待操作僅重新引發異常之一。但是,無法**重新引發的異常。

有關非同步方法中的錯誤處理的示例,請參閱 try-catch(c# 參考)。

下面的 windows 窗體示例闡釋如何在非同步方法 waitasynchronouslyasync 中使用 await。將該方法的行為與 waitsynchronously 的行為進行對比。如果未向任務應用 await 運算子,waitsynchronously 就會同步執行,而不管其定義中是否使用了 async 修飾符和在主體中是否呼叫了 thread.sleep。

c#private async void button1_click(object sender, eventargs e)

// the following method runs asynchronously. the ui thread is not

// blocked during the delay. you can move or resize the form1 window

// while task.delay is running.

public async taskwaitasynchronouslyasync()

// the following method runs synchronously, despite the use of async.

// you cannot move or resize the form1 window while thread.sleep

// is running because the ui thread is blocked.

public async taskwaitsynchronously()

Reactive框架 簡化非同步及事件驅動程式設計

net的reactive extensions包含一系列擴充套件方法和為.net 4及silverlight 4中新加入的 iobservable和 iobserver介面實現的linq標準順序運算子。加入到.net中的observable介面為基於推 push based 的通知提供了乙個公共介面...

Reactive框架 簡化非同步及事件驅動程式設計

net的reactive extensions包含一系列擴充套件方法和為.net 4及silverlight 4中新加入的 iobservable和 iobserver介面實現的linq標準順序運算子。加入到.net中的observable介面為基於推 push based 的通知提供了乙個公共介面...

實現非同步通訊

實現非同步通訊 1 定義 ajax的核心物件xmlhttprequest xmlhttprequest 是瀏覽器的xmlhttp元件的物件,通過該物件ajax可以像桌面應用程式一樣同伺服器進行資料層面的互動,不需要每次都進行整個頁面的重新整理。2 步驟 1 初始化物件並傳送xmlhttpreques...