非同步程式設計基礎

2022-01-11 03:56:34 字數 2437 閱讀 4799

本質上適合非同步的操作有:http請求,資料庫指令,web服務呼叫等。

1、暫停一段時間(以非同步方式)。

以非同步的方式暫停一段時間,這在進行單元測試或者重試延遲時非常有用。

task類有乙個返回task物件的靜態函式delay,下面是其中的乙個

public

static

task delay(timespan delay)

乙個簡單的指數退避。指數退避是一種重試策略,重試的延遲時間會逐次增加。在訪問web服務時可採用指數退避,它可以防止伺服器被太多的重試阻塞。

private

async task downloadstring(string

url)

catch

await

task.delay(nextdelay);

nextdelay = nextdelay +nextdelay;

}//最後一次呼叫,以便讓呼叫者知道出錯資訊

return

await

client.getstringasync(url);

}}

總結:task.delay適合用於對非同步**進行單元測試或者實現重試邏輯。

2、返回完成的任務task.fromresult

當要實現乙個既有非同步簽名的同步方法  或者 對非同步**進行單元測試時,都可以使用task.fromresult。

task.fromresult方法建立並返回乙個新的task物件,這個task物件是已完成,並具有特定的值。

///

creates a

that's completed successfully with the specified result.

///the result to store into the completed task.

///the type of the result returned by the task.

///the successfully completed task.

public

static taskfromresult(tresult result)

備註:如果使用task.fromresult反覆呼叫同一引數,可考慮用乙個實際的task變數,以減少垃圾**的次數。

3、報告進度iprogressprogress

非同步操作執行的過程中,需要展示操作的進度。

使用progresschanged 事件來處理進度變化,在非同步方法裡面使用report 來報告進度。

var progress = new progress();

progress.progresschanged += progress_progresschanged;

4.等待一組任務完成task.whenall

當所有任務都完成時,返回乙個完成的task

task task1 = task.delay(timespan.fromseconds(1

)); task task2 = task.delay(timespan.fromseconds(2

)); task task3 = task.delay(timespan.fromseconds(3

));

await task.whenall(task1, task2, task3);

task task1 = task.fromresult(3

); task

task2 = task.fromresult(5

); task

task3 = task.fromresult(7

);

int results = await task.whenall(task1, task2, task3);

如果所有任務型別相同,並且全部完成了,task.whenall返回存有每個任務執行結果的陣列

5、等待任意任務完成。task.whenany

使用task.whenany方法,該引數是一批任務,當乙個任務完成時,就會返回。做為返回的task就是那個完成的任務。

適用於對乙個操作進行多個獨立的嘗試,只要乙個嘗試完成,任務就算完成。例如向多個web伺服器查詢天氣等。

private

async task getstringurl(string urla, string

urlb)

非同步程式設計(基礎)

1.非同步程式設計並不是多執行緒 2.非同步程式設計只是在io操作 cpu操作 將主線程切換出去執行其他操作,不阻塞主線程,從而提公升系統併發效能 3.非同步並不能提公升程式本身執行速度,只是能在同一時間點處理更多的任務。舉個燒水的例子 如圖 上圖說明。從開始燒水到水開 不管同步還是非同步,時間是相...

C 非同步程式設計基礎(七)非同步原理

參考資料 c 非同步程式設計基礎 一 執行緒和阻塞 c 非同步程式設計基礎 二 執行緒安全 向執行緒傳遞資料和異常處理 c 非同步程式設計基礎 三 執行緒優先順序 訊號和執行緒池 c 非同步程式設計基礎 四 富客戶端應用程式的執行緒 和 同步上下文 synchronization contexts ...

C 基礎學習 非同步程式設計篇

net framework 為非同步操作提供了兩種設計模式 使用 iasyncresult 物件的非同步操作與使用事件的非同步操作。先來學習前者 bitscn.net 中國網管部落格 概述 bitscn.com iasyncresult 非同步設計模式通過名為 beginoperationname ...