C 非同步程式設計3 TPL Task 非同步程式開發

2021-08-08 03:39:43 字數 3023 閱讀 2919

.net在framework4.0中增加了任務並行庫,對開發人員來說利用多核多執行緒cpu環境變得更加簡單,tpl正符合我們本系列的技術需求。因tpl涉及內容較多,且本系列文章為非同步程式開發,所以本文並未涉及tpl全部內容。後續會寫乙個tpl系列的blog,各位朋友可以關注一下。

task

tpl的基礎task,task是tpl並行程式設計的最小單元,即表示乙個非同步操作。利用task進行非同步程式設計非常簡單:

static

void main(string

args)

,獲取非同步執行結果:

", thread.currentthread.managedthreadid,task.result));

console.readline();

}private

static

void

basetaskdemo()

", thread.currentthread.managedthreadid));

});task.start();

}private

static

void

basetaskdemo2()

", thread.currentthread.managedthreadid));

});}

程式說明:

1、new task(action)建立乙個非同步任務,引數action是非同步任務要執行的委託物件

2、task.start()啟動非同步任務的執行

3、task.run(action)等效於1、2的組合

上面的示例程式實現了非同步操作,但主線程無法獲知非同步任務完成與否。為獲取task的執行結果,上面的程式進行如下修改:

static

void main(string

args)

", thread.currentthread.managedthreadid));

task.wait();

if(task.iscompleted)

console.writeline(string.format(

"獲取非同步執行結果:

", task.result));

console.readline();

}private

static tasktaskforresult()

,task執行完成。

", thread.currentthread.managedthreadid));

return10;

});return

task;

}

程式說明:

1、下面**的原型為task.run(func),run的引數不再是action,因為在該任務中我們要返回乙個int值,所以應該使用run(func)這個過載。

var task = task.run(()=> ,task執行完成。", thread.currentthread.managedthreadid));

return 10;

});

2、主線程中呼叫task.wait()時,主線程將一直等待非同步任務完成或被取消。

3、task.iscompleted屬性用於判斷非同步任務是否完成

4、task.result獲取非同步任務的執行結果(返回值)

上面的示例程式已經實現了主線程獲取非同步程式的狀態及返回值,但如果非同步程式非常耗時,則存在主線程需要臨時取消耗時非同步程式執行的功能。為了滿足上述要求,程式可做如下調整:

static

void main(string

args)

", thread.currentthread.managedthreadid));

console.writeline(string.format(

"main 執行緒:,獲取非同步執行結果:

", thread.currentthread.managedthreadid, task.result));

console.readline();

}private

static tasktaskforresult2(cancellationtokensource tokensource)

,任務1執行完成。

", thread.currentthread.managedthreadid));

return10;

}else

}, tokensource.token);

return

task;

}

程式說明:

1、cancellationtokensource提供任務取消訊息,構造引數 5000 表示cancellationtokensource在發出5s後超時並取消

2、在task的委託內部 tokensource.iscancellationrequested 獲取取消標記

3、task.result會隱式呼叫wait()方法

如果非同步task在執行過程中出現異常,則需要對發生的異常做出響應:

static

void main(string

args)

", thread.currentthread.managedthreadid));

try,獲取非同步執行結果:

", thread.currentthread.managedthreadid, task.result));

}catch

(aggregateexception ex)

console.readline();

}private

static tasktaskforresult2(cancellationtokensource tokensource)

else

}, tokensource.token);

return

task;

}

程式說明:

1、在task中引發的異常需要在 task.wait()或task.result時捕獲

C 非同步程式設計

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

C 非同步程式設計

一 基礎知識 1 非同步程式設計 2 非同步方法 乙個程式呼叫某個方法,在處理完成前就返回該方法。同步和非同步主要用於修飾方法。當乙個方法被呼叫時,呼叫者需要等待該方法執行完畢並返回才能繼續執行,我們稱這個方法是同步方法 當乙個方法被呼叫時立即返回,並獲取乙個執行緒執行該方法內部的業務,呼叫者不用等...

C 非同步程式設計

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