日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

『飞秋』WCF热门问题编程示例

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『飞秋』WCF热门问题编程示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


WCF熱門問題編程示例(4):WCF客戶端如何異步調用WCF服務?
Posted on 2010-08-01 14:28 Frank Xu Lei 閱讀(296) 評論(3) 編輯 收藏 所屬分類: SOA and EAI, WCF熱門問題編程示例?
WCF熱門問題編程示例(4):WCF客戶端如何異步調用WCF服務?

How to call WCF Service asynchronously?

【1】問題描述:

WCF客戶端如何異步調用WCF服務?

How to call WCF Service asynchronously?

?

關于WCF如何實現異步調用的問題,論壇上出現了很多帖子,也有很多討論的文章,包括MSDN也給出了詳細的學習資料和示例代碼。但是很多資料過于籠統,MSDN的例子有點復雜。而我們實際項目中,要實現的需求,往往十分簡單,就是要在客戶端實現對于WCF服務操作的異步調用,也就是call WCF Service asynchronously。

【2】資料收集:

???? 這里收集一些關于WCF異步調用比較有用的參考資料和問題連接。其實關于WCF客戶端異步調用WCF服務的帖子很多,很多討論反而走了彎路,我們想要的就是簡單的異步調用WCF服務操作的例子。這里給出一些比較有價值的參考資料:

如何:以異步方式調用 WCF 服務操作
How to: Call WCF Service Operations Asynchronously
ASP.NET異步調用WCF
【3】異步調用:

???? 這里需要了解的一個重要概念就是異步調用機制,在.NET里的異步調用機制是十分重要的一個知識點。另外就是回調的概念,這里也會使用到。.Net中的異步調用實際使用的是異步委托。異步委托將要執行的方法提交到.Net的線程池,由線程池中的線程來執行異步調用。

【4】解決辦法:

知道了.NET異步調用的機制以后,我們就可以來嘗試解決這個問題。這里本質是一樣的。但編碼的過程有點差別。

當然,最容易理解的就是我們自己寫代碼來實現異步調用。
其次,Visual Studio 2008已經提供了這個支持。這個更加方便。我給出截圖:
?

? 我們這里給出的示例過程呢,是基于手寫客戶端異步調用代碼的。僅供參考,當然你也可以使用Visual Studio來幫助完成這個過程。

【5】服務端代碼:

???? 服務端代碼的實現十分簡單,這里我們依然使用早期WCF的代碼,定義一個IWCFService契約,包含一個操作SayHello,這個操作實現的功能,就是接受一name參數,然后打印返回字符串給客戶端,為了演示,這里會打印出時間信息。具體代碼如下:

//1.服務契約
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
??? //操作契約
??? [OperationContract]
??? string SayHello(string name);

}
//2.服務類,繼承接口。實現契約
public class WCFService : IWCFService
{
??? //實現接口定義的方法
??? public string SayHello(string name)
??? {
??????? Console.WriteLine("Call Operation at {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
??????? return string.Format("Hello {0}",name);
??? }
}

【6】客戶端代碼:

??? 客戶端的實現大部分代碼與之前的沒有區別,為了方便,我們可以在Visual Studio生成的代碼基礎上修改。當然也完全可以自己重寫。??? 這里比較重要的一點,就是要實現異步調用需要的契約以及異步調用的方法。

??? 【6.1】首先這里要實現支持異步調用的契約:

public interface IWCFService {
??? [System.ServiceModel.OperationContractAttribute(Action="http://www.cnblogs.com/frank_xl/IWCFService/SayHello", ReplyAction="http://www.cnblogs.com/frank_xl/IWCFService/SayHelloResponse")]
??? string SayHello(string name);

??? [OperationContract(AsyncPattern = true)]
??? IAsyncResult BeginSayHello(string name, AsyncCallback callback, object asyncState);

??? string EndSayHello(IAsyncResult result);
}

??? 【6.2】支持異步調用的客戶端代理類:

???? 我們要在自己的WCFClient代理類里繼承這個契約,并提供異步操作調用的實現,具體代碼如下:

public string SayHello(string name) {
????????? return base.Channel.SayHello(name);
????? }

????? public IAsyncResult BeginSayHello(string name, AsyncCallback callback, object asyncState)
????? {
????????? return Channel.BeginSayHello(name, callback, asyncState);
????? }

????? public string EndSayHello(IAsyncResult result)
????? {
????????? return Channel.EndSayHello(result);
????? }

??? 【6.3】測試客戶端代碼:

?????? 客戶端代碼還有一點比較重要的地方,就是實現異步回調方法,這里我們在調用BeginSayHello方法的時候,不需要等待結果的返回,我們自己希望,WCF在調用完SayHello操作以后,執行一些必要的工作,比如顯示返回結果,或者對返回的數據做更深入的處理,這里都需要使用到回調函數。我們也可以在回調方法里,來關閉WCF客戶端,以釋放資源。

?????? 例子代碼如下:

/// <summary>
?? /// This class is defined for WCF Async Call Test
?? /// </summary>
?? public class WCFClientTest
?? {
?????? static public WCFServiceClient wcfServiceProxy = null;
?????? static void Main(string[] args)
?????? {
?????????? Console.ForegroundColor = ConsoleColor.Yellow;

?????????? WCFClientTest client = new WCFClientTest();
?????????? wcfServiceProxy = new WCFServiceClient("WSHttpBinding_IWCFService");
?????????? string name = "Frank Xu Lei";
?????????? Console.WriteLine("Client Async Call begin at {0}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
?????????? //開始異步調用Begin Call
?????????? wcfServiceProxy.BeginSayHello(name, client.OnCompletion, null);

?????????? Console.WriteLine("press ENTER to exit…");
?????????? Console.Read();

?????? }
?????? 回調方法,Callback method
?????? void OnCompletion(IAsyncResult result)
?????? {
?????????? string value = wcfServiceProxy.EndSayHello(result);
?????????? Console.WriteLine("Returned value is {0} at {1}",value, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
?????????? result.AsyncWaitHandle.Close();
?????????? wcfServiceProxy.Close();
?????????? Console.WriteLine("Asynchronous Calls is finished");
?????? }
?? }

?

【7】運行結果:

???? 這里啟動宿主Host程序,然后運行WCF客戶端即可,我們可以看到宿主端和客戶端,異步調用操作的時間差別,打印窗口的截圖如下:

?

飛秋官網:http://www.freeeim.com/

總結

以上是生活随笔為你收集整理的『飞秋』WCF热门问题编程示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。