WCF 客户端的异步

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请求来讲,客户端异步并没有改变请求的方式,而我碰到的问题是服务端执行时间很长,导致链接中断,客户端得不到回应(由于在框架中开发,我不能把链接时间加长,如果谁有解决办法,请不吝赐教)所以并没有解决我的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值