WCF的异步可分为客户端和服务端。这篇文章介绍客户端的异步实现
异步的原理,在当前线程中,通过启动一个新线程,去执行任务,而不用让当前线程等待,等任务执行结束,回调callback方法。
客户端异步请求WCF服务,就是创建新线程去执行请求操作。这样客户端的UI线程不会因为请求而被阻塞,给用户更好的体验。
1.先定义服务端,跟普通的定义一样
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
2.接口的实现,略3.客户端在引用服务中,生成异步操作打上勾。
这样,在引用的代码中,同一个方法会生成三个方法。
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")]
string GetData(int value);
[System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")]
System.IAsyncResult BeginGetData(int value, System.AsyncCallback callback, object asyncState);
string EndGetData(System.IAsyncResult result);
4.异步方法的使用
在BeginGetData(int value, System.AsyncCallback callback, object asyncState)方法中,有参数AsyncCallback,这是委托类,在这里封装需要回到的方法。调用和回写的方法如下
private void button3_Click(object sender, EventArgs e)
{
Service.IService1 ws = new Service.Service1Client();
AsyncCallback cb = new AsyncCallback(CallBack);
ws.BeginGetData(Convert.ToInt32(textBox1.Text.Trim()), cb, ws);
button3.Enabled = false;
}
void CallBack(IAsyncResult ar)
{
Service.IService1 ws= ar.AsyncState as Service.Service1Client;
string res = ws.EndGetData(ar);
MessageBox.Show(res);
MethodInvoker mi = new MethodInvoker(Compelete);
button3.Invoke(mi);
}
按这样的方式,便实现了客户端的异步请求WCF。其实,对于一次WCF请求来讲,客户端异步并没有改变请求的方式,而我碰到的问题是服务端执行时间很长,导致链接中断,客户端得不到回应(由于在框架中开发,我不能把链接时间加长,如果谁有解决办法,请不吝赐教)所以并没有解决我的问题。