C 非同步程式設計

2021-09-25 19:39:40 字數 2857 閱讀 2585

一、基礎知識

1、非同步程式設計

(2)非同步方法:乙個程式呼叫某個方法,在處理完成前就返回該方法。

同步和非同步主要用於修飾方法。當乙個方法被呼叫時,呼叫者需要等待該方法執行完畢並返回才能繼續執行,我們稱這個方法是同步方法;當乙個方法被呼叫時立即返回,並獲取乙個執行緒執行該方法內部的業務,呼叫者不用等待該方法執行完畢,我們稱這個方法為非同步方法。

net4.0在threadpool的基礎上推出了task類,微軟極力推薦使用task來執行非同步任務。

net5.0推出了async/await,讓非同步程式設計更為方便。

非同步的優點:

非同步的好處在於非阻塞(呼叫執行緒的不會暫停執行去等待子執行緒完成),因此我們把一些不需要立即使用結果、較耗時的任務設為非同步執行,可以提高程式的執行效率。

2、c#非同步程式設計的三種模式

(1)基於任務的非同步模式(tap),它使用乙個方法來表示非同步操作的啟動和完成。

(2)基於事件的非同步模式(eap),它是用於提供非同步行為的基於事件的遺留模型。它需要乙個具有async字尾和乙個或多個事件、事件處理程式委託型別和eventarg衍生型別。

(3)非同步程式設計模型(apm)模式(也稱為iasyncresult(模式),它是使用iasyncresult介面提供非同步行為。

3、任務和執行緒的區別

(1)thread

用於開啟一條單獨的執行緒。

(2)task

task跟執行緒池threadpool的功能類似,用task開啟新任務時,會從執行緒池中呼叫執行緒,而thread每次例項化後都會建立乙個新的執行緒。

task是在threadpool的基礎上推出的,threadpool中有若干數量的執行緒,如果有任務需要處理時,會從執行緒池中獲取乙個空閒的執行緒來執行任務,任務執行完畢後執行緒不會銷毀,而是被執行緒池**以供後續任務使用。當執行緒池中所有的執行緒都在忙碌時,又有新任務要處理時,執行緒池才會新建乙個執行緒來處理該任務,如果執行緒數量達到設定的最大值,任務會排隊,等待其他任務釋放執行緒後再執行。執行緒池能減少執行緒的建立,節省開銷。

threadpool不能控制線程的執行順序,我們也不能獲取執行緒池內執行緒取消/異常/完成的通知,即我們不能有效監控和控制線程池中的執行緒。

4、task使用方法

(1)建立乙個task物件,並通過委託的方式執行某個方法

task task=new task(dowork);//建立task物件,並執行方法

private void dowork()

(2)允許向委託執行的方法傳遞資料

action action;

action =doworkobject;//定義要執行的方法

object parameterdata=...;//定義要傳遞的引數

task task=new task(action,parameterdata);

task.start();//啟動方法

private void doworkobject(object o)

(3)使用task類提供的靜態方法建立和執行任務

task task=task.run(()=>dowork());//建立task物件,並執行方法

private void dowork()

二、簡單非同步程式設計

1、async和await

c#使用關鍵字async和await實現非同步方法,async指出方法可能要非同步執行操作,而await指定非同步操作的地點。

(1)async

用async修飾乙個方法,表明這個方法時非同步的,該方法的返回型別有void、task和task,方法的內部必須含有await修飾,否則該方法依然是同步方法。

(2)async和await結構的執行順序

第一步:呼叫方法,呼叫乙個非同步方法,然後在非同步方法執行器任務的時候繼續順序執行其他語句。

第二步:執行非同步方法,非同步方法執行裡面的工作,然後立刻返回到呼叫方法。

第三步:執行await,用於非同步方法內部,指出非同步執行的任務,乙個非同步方法可能包含多個await表示式。

2、應用舉例

private async void btnclick_click(object sender, eventargs e)

.\r\n", length);

txbmainthreadid.text = thread.currentthread.managedthreadid.tostring();

}// 使用c# 5.0中提供的async 和await關鍵字來定義非同步方法

// 從**中可以看出c#5.0 中定義非同步方法就像定義同步方法一樣簡單。

// 使用async 和await定義非同步方法不會建立新執行緒,

// 它執行在現有執行緒上執行多個任務.

// 此時不知道大家有沒有乙個疑問的?在現有執行緒上(即ui執行緒上)執行乙個耗時的操作時,

// 為什麼不會堵塞ui執行緒的呢?

// 這個問題的答案就是 當編譯器看到await關鍵字時,執行緒會

C 非同步程式設計

同步方法和非同步方法的區別 同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果 非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作 非同步程式設計概覽 net framework 允許您非同步呼叫任何方法。定義與您需要呼叫的方法具有相同簽名的委託 公共語言執...

C 非同步程式設計

定義要求 方法簽名包含 async 修飾符。按照約定,非同步方法的名稱以 async 字尾結尾。返回型別為下列型別之一 1.如果你的方法有運算元為 tresult 型別的返回語句,則為 task。2.如果你的方法沒有返回語句或具有沒有運算元的返回語句,則為 task。3.void 如果要編寫非同步事...

c 非同步程式設計

c 中的async和await關鍵字是非同步程式設計的核心。通過使用這兩個關鍵字,你可以使用 net framework 或者執行時的資源來創造非同步方法 幾乎和你寫同步方法一樣。你通過使用async和await定義的方法就相當於非同步方法。在方法簽名中需要注意的三個地方 方法必須有async修飾....