WCF 學習筆記 7 非同步呼叫

2021-04-24 11:25:43 字數 2069 閱讀 8661

wcf 的非同步呼叫是基於訊息交換(message exchange)來實現的,和我們通常使用委託來實現非同步呼叫有所不同。

編寫步驟:

1. 建立服務契約。

[servicecontract(sessionmode=sessionmode.required)]

public inte***ce icalculate

2. 為契約方法新增非同步版本。

我們為 add 方法新增了 beginadd 和 endadd 兩個在 .net sdk 中 "常見" 的非同步操作方法。注意 beginadd 方法中我們新增了非同步宣告,而 endadd 方法沒有。還有就是要注意非同步版本方法的引數。

[servicecontract(sessionmode=sessionmode.required)]

public inte***ce icalculate

3. 實現服務契約。

你可能注意到了,我們並沒有建立 add 的委託原型,也沒有 "真正" 實現 beginadd 和 endadd。這是因為訊息交換會 "非同步" 呼叫 add 方法,所有的非同步版本方法只是用來建立訊息宣告而已。

public class calculateservice : icalculate

public iasyncresult beginadd(int a, int b, asynccallback callback, object state)

public int endadd(iasyncresult ar)

}4. 我們給乙個完整版本,看看執行結果。

console.writeline("客戶端呼叫 beginadd 完成: ", datetime.now);

console.writeline(channel.endadd(ar));

console.writeline("客戶端呼叫 endadd 完成: ", datetime.now); }

} }輸出:客戶端呼叫 beginadd: 2007-4-1 20:56:47

客戶端呼叫 beginadd 完成: 2007-4-1 20:56:47

伺服器方法 add 開始執行: 2007-4-1 20:56:49

伺服器方法 add 執行完成: 2007-4-1 20:56:54

3客戶端呼叫 endadd 完成: 2007-4-1 20:56:55

callback...

最後需要注意的是,我們必須使用支援 session 的 binding 物件 (basichttpbinding 會丟擲異常)。

附:其實最簡單的辦法不是手工新增 asyncpattern / begin*** / end***,而是手工使用 svcutil.exe 生成客戶端**,記住加上 "/async" 引數。

WCF 非同步呼叫

說明 wcf客戶端非同步呼叫與服務端 沒有關係,只是和客戶端的 有關係。服務端服務介面 using system using system.collections.generic using system.linq using system.text using system.servicemode...

WCF之非同步呼叫

非同步呼叫 獲得系統更好的吞吐量。使用者體驗性更好。但有時弄不好也會增加系統負擔。有兩種方法。我這裡只採用wshttp的方式。並且是採用新增服務引用的方法來做的。只需兩下就可以完成。1 在新增的 服務引用 上。配置 服務引用 勾選 以非同步來操作 2 它會自動新增 begin方法 和 end方法 這...

WCF 非同步呼叫問題

新增引用時生成 勾選允許生成非同步操作 wcf非同步呼叫三種方式 第一種 直接呼叫非同步方法 var serviceclient new myserviceclient serviceclient.messageasync erviceclient.close 第二種 begin end方式 ser...