C 基礎學習 非同步程式設計篇

2021-04-15 13:03:32 字數 3215 閱讀 1048

。net framework 為非同步操作提供了兩種設計模式:使用 iasyncresult 物件的非同步操作與使用事件的非同步操作。先來學習前者

bitscn.net*中國網管部落格

概述[bitscn.com]

iasyncresult 非同步設計模式通過名為 beginoperationname 和 endoperationname 的兩個方法來實現原同步方法的非同步呼叫,如 filestream 類提供了 beginread 和 endread 方法來從檔案非同步讀取位元組,它們是 read 方法的非同步版本 www@bitscn@com

begin 方法包含同步方法簽名中的任何引數,此外還包含另外兩個引數:乙個asynccallback 委託和乙個使用者定義的狀態物件。委託用來呼叫**方法,狀態物件是用來向**方法傳遞狀態資訊。該方法返回乙個實現 iasyncresult 介面的物件

[bitscn.com]

end 方法用於結束非同步操作並返回結果,因此包含同步方法簽名中的 ref 和 out 引數,返回值型別也與同步方法相同。該方法還包括乙個 iasyncresult 引數,用於獲取非同步操作是否完成的資訊,當然在使用時就必須傳入對應的 begin 方法返回的物件例項

中國_網管聯盟bitscn.com

開始非同步操作後如果要阻止應用程式,可以直接呼叫 end 方法,這會阻止應用程式直到非同步操作完成後再繼續執行。也可以使用 iasyncresult 的 asyncwaithandle 屬性,呼叫其中的waitone等方法來阻塞執行緒。這兩種方法的區別不大,只是前者必須一直等待而後者可以設定等待超時 bbs.bitscn.com網管論壇

如果不阻止應用程式,則可以通過輪循 iasyncresult 的 iscompleted 狀態來判斷操作是否完成,或使用 asynccallback 委託來結束非同步操作。asynccallback 委託包含乙個 iasyncresult 的簽名,**方法內部再呼叫 end 方法來獲取操作執行結果 bitscn.net*中國網管部落格

嘗試

www@bitscn@com

先來熟悉一下今天的主角,iasyncresult 介面

bbs.bitscn.com中國網管論壇

public inte***ce iasyncresult

waithandle asyncwaithandle

bool completedsynchronously

bool iscompleted

} bbs.bitscn.com

bitscn~com

我用乙個 asyncdemo 類作為非同步方法的提供者,後面的程式都會呼叫它。內部很簡單,建構函式接收乙個字串作為 name ,run 方法輸出 "my name is " + name ,而非同步方法直接用委託的 begininvoke 和 endinvoke 方法實現 bitscn.net*中國網管部落格

public class asyncdemo

/**

/// synchronous method

///

///

public string run()

/**

/// asynchronous begin method

///

///

///

///

public iasyncresult beginrun(asynccallback callback, object stateobject)

catch(exception e) }

/**

/// asynchronous end method

///

///

///

public string endrun(iasyncresult ar)

catch (exception e) }

} [bitscn.com]

bbs.bitscn.com網管論壇

首先是 begin 之後直接呼叫 end 方法,當然中間也可以做其他的操作 bbs.bitscn.com

class asynctest }

bbs.bitscn.com中國網管論壇

bitscn#com中國網管聯盟

也可以用 iasyncresult 的 asyncwaithandle 屬性,我在這裡設定為1秒超時

bitscn#com中國網管聯盟

class asynctest

else }

} bitscn.net*中國網管部落格

bitscn.net*中國網管部落格

不中斷的輪循,每次迴圈輸出乙個 "."

bitscn#com中國網管聯盟

class asynctest

console.writeline();

// still need use end method to get result,

// but this time it will return immediately

string demoname = demo.endrun(ar);

console.writeline(demoname);

} } bbs.bitscn.com中國網管論壇

bitscn#com中國網管聯盟

最後是使用**方法並加上狀態物件,狀態物件被作為 iasyncresult 引數的 asyncstate 屬性被傳給**方法。**方法執行前不能讓主線程退出,我這裡只是簡單的讓其休眠了1秒。另乙個與之前不同的地方是 asyncdemo 物件被定義成了類的靜態字段,以便**方法使用 中國_網管聯盟bitscn.com

class asynctest

// callback method

static void output(iasyncresult ar)

else }

} [bitscn.com]

其他

對於乙個已經實現了 beginoperationname 和 endoperationname 方法的物件,我們可以直接用上述方式呼叫,但對於只有同步方法的物件,我們要對其進行非同步呼叫也不需要增加對應的非同步方法,而只需定義乙個委託並使用其 begininvoke 和 endinvoke 方法就可以了

本文**

C 非同步程式設計基礎(七)非同步原理

參考資料 c 非同步程式設計基礎 一 執行緒和阻塞 c 非同步程式設計基礎 二 執行緒安全 向執行緒傳遞資料和異常處理 c 非同步程式設計基礎 三 執行緒優先順序 訊號和執行緒池 c 非同步程式設計基礎 四 富客戶端應用程式的執行緒 和 同步上下文 synchronization contexts ...

非同步程式設計基礎

本質上適合非同步的操作有 http請求,資料庫指令,web服務呼叫等。1 暫停一段時間 以非同步方式 以非同步的方式暫停一段時間,這在進行單元測試或者重試延遲時非常有用。task類有乙個返回task物件的靜態函式delay,下面是其中的乙個 public static task delay time...

非同步程式設計(基礎)

1.非同步程式設計並不是多執行緒 2.非同步程式設計只是在io操作 cpu操作 將主線程切換出去執行其他操作,不阻塞主線程,從而提公升系統併發效能 3.非同步並不能提公升程式本身執行速度,只是能在同一時間點處理更多的任務。舉個燒水的例子 如圖 上圖說明。從開始燒水到水開 不管同步還是非同步,時間是相...