WCF中的異步實現
- 通過SvcUtil /async 直接生產異步代理;
- 通過添加應用的方式,點擊”添加引用“的“高級”按鈕,在彈出來的對話框中選擇“生成異步”。如圖:

生成的異步調用代理類部分借口:
public System.IAsyncResult BeginAdd(int x, int y, System.AsyncCallback callback, object asyncState) {
return base.Channel.BeginAdd(x, y, callback, asyncState);
}
public void AddAsync(int x, int y) {
this.AddAsync(x, y, null);
}
public void AddAsync(int x, int y, object userState) {
if ((this.onBeginAddDelegate == null)) {
this.onBeginAddDelegate = new BeginOperationDelegate(this.OnBeginAdd);
}
if ((this.onEndAddDelegate == null)) {
this.onEndAddDelegate = new EndOperationDelegate(this.OnEndAdd);
}
if ((this.onAddCompletedDelegate == null)) {
this.onAddCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnAddCompleted);
}
base.InvokeAsync(this.onBeginAddDelegate, new object[] {
x,
y}, this.onEndAddDelegate, this.onAddCompletedDelegate, userState);
}
1、客戶端異步調用服務
客戶端異步調用服務主要方式有幾種:
測試代碼如下:
{
Console.WriteLine(i);
}
int resul = calculatorClient.EndAdd(asyncResult);
Console.WriteLine(string.Format("計算結果:{0}",resul));
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
}
Console.WriteLine("開始計算...");
return x + y;
}
服務端輸出如下:
客戶端輸出如下:
{
Console.WriteLine(i);
}
Thread.Sleep(5000);
Console.WriteLine("開始計算...");
return x + y;
delegate(IAsyncResult asyncResult)
{
int [] array = asyncResult.AsyncState as int [];
int result= calculatorClient.EndAdd(asyncResult1);
calculatorClient.close()
Console.WriteLine(string.Format("{0}+{1}={2}", array[0], array[1], result));
}, new []{1,2});
這種方式是對服務的異步調用完成以后,自動調用回調來獲取結果。
calculatorClient.AddAsync(10, 36, new[] { 1000 });
//為異步調用完成定義觸發事件
calculatorClient.AddCompleted += calculatorClient_AddCompleted;
Console.WriteLine("服務調用完成...");
Console.ReadKey();
//異步調用完成后執行
privatestaticvoid calculatorClient_AddCompleted(object obj, AddCompletedEventArgs args)
{
var array = args.UserState as int[];
int result = args.Result;
Console.WriteLine(result);
}
將服務定義為異步服務,契約定義如下 :
IAsyncResult BeginCalculator
(int x,int y ,AsyncCallback asyncCallback, object state);
void EndCalculator(IAsyncResult);
然后在實現契約接口的服務中,將方法實現為異步的。
浙公網安備 33010602011771號