非同步程式設計,await async入門

2022-02-11 06:37:40 字數 3747 閱讀 5797

非同步程式設計模型

.net支援3種非同步程式設計模式:

msdn:

推薦大家先看我寫的,再針對各個部分檢視msdn的詳細內容

1、  非同步程式設計模型 (apm:asynchronous programming model)

使用 iasyncresult 設計模式的非同步操作是通過名為 beginoperationname 和 endoperationname 的兩個方法來實現的,這兩個方法分別開始和結束非同步操作 operationname

開始非同步操作

beginoperationname 方法開始非同步操作 operationname,並返回實現 iasyncresult 介面的物件。 iasyncresult 物件儲存有關非同步操作的資訊。

結束非同步操作

endoperationname 方法用於結束非同步操作 operationname。 endoperationname 方法的返回值與其同步對應方法的返回值型別相同,並且是特定於非同步操作的。

在msdn上是以檔案讀取作為例子。這裡以更簡單的例子進行演示。如果可以進行單元測試的,可直接在單元測試中進行,沒有的則可以使用控制台應用程式進行。

委託物件有以begininvoke和endinvoke,所以使用委託進行演示:

1.1要被呼叫的方法:這是乙個帶有引數且有字串返回值的方法

1

static

string showinfo(string

info)23

1819

return

result.tostring();

2021 }

以上方法,乙個輸入,乙個輸出,都是字串,方法體中會列印方法呼叫字樣,並列印輸入字串。然後計算1到99的數字的和值,其中每次數字輸出會休眠10毫秒。最後返回和值。

以上僅為演示和模擬演算法效果。

1.2

1

//委託物件23

static sayhi xx = new

sayhi(showinfo);45

static

void main(string

args)67

以上方法,先定義了乙個與1.1中方法showinfo方法匹配的委託:即此委託物件可以apm非同步呼叫,即非同步呼叫 showinfo方法。

在begininvoke時,第二個引數,即**方法設定為null,即不使用**方法。

begininvoke方法如下:

public iasyncresult begininvoke (

invokeargs invokeargs,

asynccallback callback,

object userstate

)第乙個引數是委託方法的引數:showinfo方法的輸入引數

第二個引數是**方法:完成呼叫showinfo方法後要執行的動作,這裡是個(**)方法

第三個引數是操作關聯的可選狀態

endinvoke方法如下:

public invokecompletedresult endinvoke (

iasyncresult asyncresult

)引數是 begininvoke方法的返回值。而返回值是invokecompletedresult型別,委託物件的返回值,即方法showinfo的返回值。

begininvoke方法的返回值為iasyncresult型別。第二個引數為asynccallback型別。

asynccallback是乙個委託型別,檢視它的定義是這樣的:

public delegate void asynccallback(iasyncresult ar);

它是乙個無返回值引數是iasyncresult型別的委託。所以**方法簽名與與這相符,定義**方法如下:

//

**方法

static

void

show(iasyncresult asr)

2、  基於事件的非同步模式 (eap)未完待3、  基於任務的非同步模式 (tap)與之離不開的是task類。它的構造方法如下:

即,接收action委託。

最簡單的呼叫如下:

1

static

void main(string

args)23

;1213 task t = new

task(act);

1415

t.start();

1617

console.read();

1819 }

通過匿名方法,lambda可以省略為:

1

static

void main(string

args)23

;1213 task t = new task(()=>);

1819

t.start();

2021

console.read();

2223 }

此外,可以通過task的靜態工廠建立任務,如下:

1 task t =task.factory.startnew(

23 () =>89

);10

11t.start();

1213 console.read();

總之,效果是一樣的。

以下**用於演示同步:

1

static

void main(string

args)23

);10

11try

1213

2021

catch

(aggregateexception)

2223

2829 console.writeline(5

);30

31console.read();

3233 }

首先main輸出 1和2,然後此時插入任務taska。它在休眠2秒後,輸出3,然後任務結束後輸出4,最後main中輸出5。

任務taska執行完畢後大概需要2秒鐘的時間,這樣,如果不等待taska,即taska啟動執行後,不等待執行完畢,則會執行輸出  4和5。

最終列印結果是:1,2,4,5,3(順序是這樣的,但格式是帶回車的)

如果進行等待,wait() 不帶引數,表示一直等待到任務執行完畢。

這樣,就可以按順序輸出了,最終結果是:1,2,3,4,5

同樣的task類有對應的泛型型別,這裡不演示了。

await

msdn:

await運算子用於非同步方法中的任務,在方法的執行中插入掛起點,直到所等待的任務完成。僅可用於由async關鍵字修改的非同步方法中。

應用await運算子的任務通常由實現基於任務的非同步模式的方法呼叫返回。包括:task,task,valuetask 和valuetask物件的方法。

async

msdn:

async修飾符可將方法、lambda表示式,匿名方法指定為非同步,帶此修飾符的方法或表示式稱為非同步方法。

非同步多執行緒 await async

await async 是乙個語法糖,本身不會產生新的執行緒,但是依託於task而存在,所以執行時,也是會有多執行緒。async可以沒有await,但await一定要有async,並且只能只能出現在task前面。原來沒有返回值的方法,用await async修飾後,會返回task 原來有返回值t的方...

AwaitAsync 非同步和多執行緒)

這個大佬寫的文章,我還是很喜歡的 這篇文章是討論在.net中使用程序內com元件時的公寓模型,以乙個示例直觀演示stathread和mtathread的作用和區別。c 5.0,net framework4.5 async await是語法糖,本身就跟編譯器提供的功能。在winform中,是乙個sta...

Socket非同步程式設計

以 socket 通訊中的非同步方法為例 public static manualresetevent connectdone new manualresetevent false public static void connectcallback iasyncresult ar sclient....