C 非同步程式設計

2021-04-19 20:03:34 字數 2983 閱讀 3805

同步方法和非同步方法的區別

同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果;

非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作

非同步程式設計概覽

.net framework 允許您非同步呼叫任何方法。定義與您需要呼叫的方法具有相同簽名的委託;公共語言執行庫將自動為該委託定義具有適當簽名的 begininvoke 和 endinvoke 方法。

begininvoke方法用於啟動非同步呼叫。它與您需要非同步執行的方法具有相同的引數,只不過還有兩個額外的引數(將在稍後描述)。begininvoke 立即返回,不等待非同步呼叫完成。begininvoke 返回 iasyncresult,可用於監視呼叫進度。

endinvoke方法用於檢索非同步呼叫結果。呼叫 begininvoke 後可隨時呼叫 endinvoke 方法;如果非同步呼叫未完成,endinvoke 將一直阻塞到非同步呼叫完成。endinvoke 的引數包括您需要非同步執行的方法的 out 和 ref 引數(在 visual basic 中為 byref 和 byref)以及由begininvoke 返回的 iasyncresult。

四種使用 begininvoke 和 endinvoke 進行非同步呼叫的常用方法。呼叫了 begininvoke 後,可以:

1.進行某些操作,然後呼叫 endinvoke 一直阻塞到呼叫完成。

2.使用 iasyncresult.asyncwaithandle 獲取 waithandle,使用它的 waitone 方法將執行一直阻塞到發出waithandle 訊號,然後呼叫endinvoke。這裡主要是主程式等待非同步方法,等待非同步方法的結果。

3.輪詢由 begininvoke 返回的 iasyncresult,iasyncresult.iscompeted確定非同步呼叫何時完成,然後呼叫endinvoke。此處理個人認為與相同。

4.將用於**方法的委託傳遞給 begininvoke。該方法在非同步呼叫完成後在 threadpool 執行緒上執行,它可以呼叫endinvoke。這是在強制裝換**函式裡面iasyncresult.asyncstate(begininvoke方法的最後乙個引數)成委託,然後用委託執行endinvoke。警告 始終在非同步呼叫完成後呼叫 endinvoke。

以上有不理解的稍後可以再理解。 例子

1)先來個簡單的沒有**函式的非同步方法例子

請再執行程式的時候,仔細看注釋,對理解很有幫助。還有,若將注釋的中的兩個方法都同步,你會發現非同步執行的速度優越性。

using system;

// 同步方法

void event2()

console.writeline("event2 end"); }

[stathread]

static void main(string args)

} }

2)下面看有**函式的webrequest和webresponse的非同步操作。

using system;

using system.net;

using system.threading;

using system.text;

using system.io;

// requeststate 類用於通過

// 非同步呼叫傳遞資料

public class requeststate

} // clientgetasync 發出非同步請求

class clientgetasync

// 從命令列獲取 uri

// 建立請求物件

// 建立狀態物件

requeststate rs = new requeststate();

// 將請求新增到狀態,以便它可以被來回傳遞

rs.request = wreq;

// 發出非同步請求

iasyncresult r = (iasyncresult)wreq.begingetresponse(new asynccallback(respcallback), rs);

// 將 manualresetevent 設定為 wait,

// 以便在呼叫**前,應用程式不退出

alldone.waitone(); }

public static void showusage()

private static void respcallback(iasyncresult ar)

private static void readcallback(iasyncresult asyncresult)

else

// 關閉響應流

responsestream.close();

// 設定 manualresetevent,以便主線程可以退出

alldone.set(); }

return; }

}在這裡有**函式,且非同步**中又有非同步操作。

首先是非同步獲得responsestream,然後非同步讀取資料。

這個程式非常經典。從中可以學到很多東西的。我們來共同**。

總結

上面說過,.net framework 可以非同步呼叫任何方法。所以非同步用處廣泛。

在.net framework 類庫中也有很多非同步呼叫的方法。一般都是已begin開頭end結尾構成一對,非同步委託方法,外加兩個**函式和asyncstate引數,組成非同步操作的巨集觀體現。所以要做非同步程式設計,不要忘了委託delegate、begin,end,asynccallback委託,asyncstate例項(在**函式中通過iasyncresult.asyncstate來強制轉換),iasycresult(監控非同步),就足以理解非同步真諦了。

C 非同步程式設計

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

C 非同步程式設計

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

c 非同步程式設計

c 中的async和await關鍵字是非同步程式設計的核心。通過使用這兩個關鍵字,你可以使用 net framework 或者執行時的資源來創造非同步方法 幾乎和你寫同步方法一樣。你通過使用async和await定義的方法就相當於非同步方法。在方法簽名中需要注意的三個地方 方法必須有async修飾....