按照操作執行所需的資源類型
服務調用就是典型的I/O綁定型操作
一
異步服務代理的創建
一般的服務代理繼承自ClientBase<TChannel>
在添加服務引用的時候
對應生成的服務代理類中就會多出幾個方法(下面都以計算的服務為例)
[csharp]
public partial class CalculatorClient:ClientBase<ICalculator>
{
public event System
public IAsyncResult BeginAdd(double x
public double EndAdd(System
public AddAsync(double x
public AddAsync(double x
}
其中Add用於同步服務調用
調用BeginXxx方法讓相應的操作在另一個線程執行
[csharp]
CalculatorClient proxy=new CalculatorClient()
IAsyncResult asyncResult=proxy
//其他操作
//Endxx方法可以根據異步操作可能的執行時間來決定調用執行
double result=proxy
proxy
Console
注意
我們可以看看上面服務代理類中多出來的幾個方法中BeginAdd方法
public IAsyncResult BeginAdd(double x
①其中參數類型為AsyncCallback的callback
②參數asyncState可以用於向回調操作傳遞一些額外的參數
[csharp]
public delegate void AsyncCallback(IAsyncResult ar)
public interface IAsyncResult
{
object AsyncState {get;}
WaitHandle AsyncWaitHandle {get;}
bool CompletedSynchronously { get;}
bool IsCompleted { get;}
}
下面通過一個匿名方法的形式定義回調操作
[csharp]
CalculatorClient proxy=new CalculatorClient()
proxy
delegate(IAsyncResult asyncResult)
{
double[] operNums=asyncResult
double result=proxy
proxy
Console
}
在那個異步服務代理類中還有兩個異步執行的AddAsync方法重載和一個AddComplete事件
public AddAsync(double x
public AddAsync(double x
其中userState參數和BeginAdd方法的asyncState參數具有相同的作用
[csharp]
public event System
public class AddCompleteEventArgs:EventArgs
{
public bool Cancelled{get;}
public Exception Error{get;}
public object UserState {get;}
}
事件參數AddCompleteEventArgs定義了
由於AddAsync方法是以異步方式執行的
[csharp]
CalculatorClient proxy=new CalculatorClient()
proxy
{
double[] operNums=args
double result=args
proxy
Console
};
proxy
二
上面介紹了如何調用異步服務
異步操作模式
前面提到過在OperationContractAttributes特性的AsyncPattern屬性
異步服務操作是通過BeginXxx/EndXxx兩個配對的方法實現的
三
客戶端讀取
From:http://tw.wingwit.com/Article/program/net/201311/13034.html