非同步程式設計模型
.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以上方法,乙個輸入,乙個輸出,都是字串,方法體中會列印方法呼叫字樣,並列印輸入字串。然後計算1到99的數字的和值,其中每次數字輸出會休眠10毫秒。最後返回和值。static
string showinfo(string
info)23
1819
return
result.tostring();
2021 }
以上僅為演示和模擬演算法效果。
1.2
1以上方法,先定義了乙個與1.1中方法showinfo方法匹配的委託:即此委託物件可以apm非同步呼叫,即非同步呼叫 showinfo方法。//委託物件23
static sayhi xx = new
sayhi(showinfo);45
static
void main(string
args)67
在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型別的委託。所以**方法簽名與與這相符,定義**方法如下:
//2、 基於事件的非同步模式 (eap)未完待3、 基於任務的非同步模式 (tap)與之離不開的是task類。它的構造方法如下:**方法
static
void
show(iasyncresult asr)
即,接收action委託。
最簡單的呼叫如下:
1通過匿名方法,lambda可以省略為:static
void main(string
args)23
;1213 task t = new
task(act);
1415
t.start();
1617
console.read();
1819 }
1此外,可以通過task的靜態工廠建立任務,如下:static
void main(string
args)23
;1213 task t = new task(()=>);
1819
t.start();
2021
console.read();
2223 }
1 task t =task.factory.startnew(總之,效果是一樣的。23 () =>89
);10
11t.start();
1213 console.read();
以下**用於演示同步:
1首先main輸出 1和2,然後此時插入任務taska。它在休眠2秒後,輸出3,然後任務結束後輸出4,最後main中輸出5。static
void main(string
args)23
);10
11try
1213
2021
catch
(aggregateexception)
2223
2829 console.writeline(5
);30
31console.read();
3233 }
任務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....