在面向服务的.NET开发中,我们经常要调用WCF服务加载数据,这时候,如果使用同步调用,会阻止UI,影响用户体验UE/UX,而且当服务器ping不通或者网速特别烂的情况下,这时候基本上是处于卡死状态,令人难以接受。

因此,实现一步调用WCF是.NET开发中一个必须的步骤。下面介绍如何实现一步调用WCF。

第一步:在WCF端建立一个WCF服务:WcfService,建立一个接口SumByTwoNumber,返回相加结果int;

 

第二步:在WPF端引用该WCF服务并实例化:

WcfService.WcfServiceClient client = new WcfService.WcfServiceClient();

 

第三步:你可以使用定义代理来实施异步调用,或者使用匿名代理。这里我们用定义代理

     创建delegate对象,并将你想要传递的函数作为参数传入。 
     创建代理对象的方法:
         1). MyDelegate myDelegate = new MyDelegate(实例名.方法名);
         2). MyDelegate myDelegate = new MyDelegate(类名.方法名);
     注:

     如果需要代理的方法是一个static静态方法的话,采用第2种方式,否则采用第1种方式。
     这里我们使用静态方法,免去创建实例的过程。

 

第四步:就是执行异步调用并获得返回值了,用myDelegate的BeginInvoke

     获得数据的方法是执行myDelegate.EndInvoke,它的返回值就是在我们的WCF服务接口返回的数据。

     注:
     A. 这个EndInvoke一定要保证在BeginInvoke的callBack里调用,因为只有在服务接口执行完了才会有数据;

     B. 取得数据后如果要操作WPF的UI,不能直接在callBack里操作,因为callBack执行的时候已经不是和UI在同一个线程了,要用UI线程的话,需要使用Dispatcher.BeginInvoke()..

以下是完整代码:

 

    public partial class MainWindow : Window
    {
        public delegate int MyDelegate(int num1, int num2);
        MyDelegate myDelegate = new MyDelegate(MainWindow.AsynchronousCall);
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private static int AsynchronousCall(int num1, int num2)
        {
 
            try
            {
                WcfService.WcfServiceClient client = new WcfService.WcfServiceClient();
                return client.SumByTwoNumber(num1, num2);
            }
            catch
            {
                return -1;
            }
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IAsyncResult result = myDelegate.BeginInvoke(1, 3, (res) =>
            {
                int sum = myDelegate.EndInvoke(res);
                if (sum == -1)
                {
                    MessageBox.Show("无法连接服务器!");
                    CloseWating();
                    return;
                }
                Show("结果为", sum.ToString());
            }, null);
            this.label.Content = null;
            ShowWating();
        }
 
        void Show(params string[] str)
        {
            this.Dispatcher.BeginInvoke(
                new Action(() =>
                {
                    StringBuilder sb = new StringBuilder();
                    str.ToList().ForEach(s => sb.Append(s));
 
                    this.label.Content = new TextBlock() { Text = sb.ToString() };
                    CloseWating();
                })
            );
        }
 
        private void ShowWating()
        {
            //显示等待条
        }
 
        private void CloseWating()
        {
            //关闭等待条
        }
    }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

参考来源:http://www.cnblogs.com/itelite/archive/2011/12/13/2286647.html

这个来源写的是使用匿名代理方法,有些童鞋可能还不是特别熟悉,因此我就用常规的定义代理方法写了。

O(∩_∩)O~

如何实现异步调用WCF的更多相关文章

  1. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

  2. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  3. WPF异步调用WCF服务

    wpf调用wcf时,第一次访问总耗时到达几秒,影响界面的用户体验,因此在wpf加载界面和加载数据时采用异步加载,即异步访问wcf服务, 由于是否采用异步加载和服务端无关,仅仅由客户端自己根据需要来选择 ...

  4. 异步调用WCF的方法需要小心的地方

    直接使用下面的代码,由于client对象占用的资源没有被释放,会导致内存泄露GetSimServiceReference.GetSimServiceClient client = new GetSim ...

  5. Silverlight中异步调用WCF服务,传入回调函数

    以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void ...

  6. WCF系列教程之客户端异步调用服务

    本文参考自http://www.cnblogs.com/wangweimutou/p/4409227.html,纯属读书笔记,加深记忆 一.简介 在前面的随笔中,详细的介绍了WCF客户端服务的调用方法 ...

  7. Silverlight调用WCF(1)

    [置顶] Silverlight调用WCF(1) 分类: 技术2012-03-31 12:29 940人阅读 评论(0) 收藏 举报 wcfsilverlightexceptionusersecuri ...

  8. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  9. WCF 异步调用问题

    添加引用时生成"勾选允许生成异步操作" Wcf异步调用三种方式: 第一种:直接调用异步方法 var serviceClient = new MyServiceClient(); s ...

随机推荐

  1. hdu4521-小明系列问题——小明序列(线段树区间求最值)

    题意:求最长上升序列的长度(LIS),但是要求相邻的两个数距离至少为d,数据范围较大,普通dp肯定TLE.线段树搞之就可以了,或者优化后的nlogn的dp. 代码为  线段树解法. #include ...

  2. 负重前行的婚纱线上路 - i天下网商-最具深度的电商知识媒体

    负重前行的婚纱线上路 - i天下网商-最具深度的电商知识媒体 负重前行的婚纱线上路

  3. 第29讲 UI组件之 ListView与 BaseAdapter,SimpleAdapter

    第29讲 UI组件之 ListView与 BaseAdapter,SimpleAdapter 1.BaseAdapter BaseAdapter是Android应用程序中经常用到的基础数据适配器,它的 ...

  4. 解决selenium 启动ie浏览器报错:Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones

    启动ie代码: System.setProperty("webdriver.ie.driver", "bin/IEDriverServer.exe"); Web ...

  5. html checkbox全选或者全不选

    /* 全选或全不选 */ function CheckedAllOrNo() { var arr = $(':checkbox'); for (var i = 1; i < arr.length ...

  6. Object-c学习之路十二(OC的copy)

    oc中的拷贝分为:copy(浅拷贝)和mutablecopy(深拷贝). 浅拷贝也为指针拷贝,拷贝后原来的对象计数器会+1: 深拷贝为对象拷贝,原来的对象计数器不变. 注意:自定义对象拷贝时要实现NS ...

  7. [manacher] hdu 3294 Girls&#39; research

    题意: 给一个字符x代表真实的a 然后输出的时候转换 然后就是求最长回文子串的串是什么 长度要大于1 思路: 就是裸的manacher,弄清楚下标的转换关系就好了 代码: #include" ...

  8. Android-IM架构设计

    ###1. 架构总览 ###2. 模块介绍 ####2.1 协议封装与任务流程 #####1) 协议与任务的封装 a. 协议有协议头(协议头因为格式相同,被抽象出来)和协议体组成,协议有两类:请求协议 ...

  9. FileZilla 安装配置参考

    http://www.admin10000.com/document/72.html 解决 NAT issue https://wiki.filezilla-project.org/Network_C ...

  10. css-盒模型,浮动,定位之间的关系

    网站布局属性:盒模型:调整元素间距float浮动:竖排的块级元素改成横排position定位:重叠元素,精确控制元素位置 能用盒模型,不用float,能用浮动,不用定位