本質上適合非同步的操作有:http請求,資料庫指令,web服務呼叫等。
1、暫停一段時間(以非同步方式)。
以非同步的方式暫停一段時間,這在進行單元測試或者重試延遲時非常有用。
task類有乙個返回task物件的靜態函式delay,下面是其中的乙個
publicstatic
task delay(timespan delay)
乙個簡單的指數退避。指數退避是一種重試策略,重試的延遲時間會逐次增加。在訪問web服務時可採用指數退避,它可以防止伺服器被太多的重試阻塞。
privateasync 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、報告進度iprogress和progress
非同步操作執行的過程中,需要展示操作的進度。
使用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伺服器查詢天氣等。
privateasync 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 ...