Task任務 多執行緒 非同步呼叫返回值問題

2022-02-23 01:59:01 字數 1605 閱讀 3544

在我們運用多執行緒,或者多工作業時,有時候不可避免的會要的到某方法的執行結果,在這裡總結任務、多執行緒和非同步呼叫返回值問題。

先建立乙個task物件,與task的區別在於task物件有個tresult型別的返回值。建立完物件呼叫start()方法,為了獲取方法的返回值,要查詢task物件的result屬性,如果任務還沒有完成他的工作,結果則不可用,result屬性就會阻塞呼叫者。**如下

view code

1 task task = new task(() => test());//

建立任務

2 taskw.start();//

開始任務

3int result = taskw.result;//

得到呼叫方法的結果45

public

inttest()

6

非同步呼叫返回結果我們必須用到iasyncresult物件。首先我們通過委託呼叫需要非同步執行的方法,在結束非同步時,呼叫方法endinvoke()方法得到委託方法的返回值。**如下

view code

1

private

string

maintest()210

11//

非同步執行的方法

12public

string

test()

13

在多執行緒應用程式中提供和返回值是很複雜的,因此必須對某個過程的引用傳遞給執行緒類的建構函式,該過程不帶引數也不返回值。

由於這些過程不能為函式也不能使用byref引數,因此從執行於不同執行緒的過程返回值是很複雜的。返回值的最簡單方法是:使用backgroundworker元件來管理執行緒,在任務完成時引發事件,然後用事件處理程式處理結果。

view code

1

class

areaclass2210

}1112private

system.componentmodel.backgroundworker backgroundworker1

13 = new

system.componentmodel.backgroundworker();

1415

private

void

testarea2()

1626

27private

void

initializebackgroundworker()

2835

36private

void

backgroundworker1_dowork(

37object

sender,

38system.componentmodel.doworkeventargs e)

3944

45private

void

backgroundworker1_runworkercompleted(

46object

sender,

47system.componentmodel.runworkercompletedeventargs e)

48

更多關於多執行緒返回值參見和

自此推薦一篇學習多執行緒和非同步呼叫的文章

非同步呼叫和多執行緒呼叫

同步方法和非同步方法的區別 同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果 非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作 現在新建乙個windows應用程式,然後放上乙個button1,寫入以下 c code private void button...

JAVA多執行緒實現非同步呼叫

時間 只需要領個提貨單就可以了 去幹別的事情 等到蛋糕做好了,再拿提貨單取蛋糕就可以了。package com.somnus async description 顧客 date 2016年3月9日 下午7 20 41 version 1.0 public class customer catch i...

ZT 非同步呼叫與多執行緒的區別

多執行緒和非同步操作的異同 多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多執行緒和非同步操作是等同的概念。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。非同步操作的本質 所有的程式最終都...