在面向服务的.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. jquery判断checkbox是否选中

    $('input:checkbox').click(function () { if ($("#chkPile").is(":checked")) { $(); ...

  2. hdu3849-By Recognizing These Guys, We Find Social Networks Useful:双连通分量

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others)     ...

  3. 基于PCA和SVM的人脸识别

    程序中采用的数据集是ORL人脸库,该人脸库共有400副人脸图像,40人,每人10幅,大小为112*92像素,同一个人的表情,姿势有少许变化. 程序的流程主要分为三部分,数据的预处理(PCA降维和规格化 ...

  4. Js获取元素样式值(getComputedStyle&currentStyle)兼容性解决方案

    因为:style(document.getElementById(id).style.XXX)只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. 一般js获取内部样式和外部样式使用 ...

  5. EL 表达式中自己定义函数

    第一步: 在WEB-INF/tld/ 文件夹下创建一个func.tld文件例如以下: <taglib xmlns="http://java.sun.com/xml/ns/j2ee&qu ...

  6. [CSAPP笔记][第十一章网络编程]

    第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...

  7. (转)第一天 XHTML CSS基础知识 文章出处:标准之路(http://www.aa25.cn/div_css/902.shtml)

    欢迎大家学习<十天学会web标准>,也就是我们常说的DIV+CSS.不过这里的DIV+CSS是一种错误的叫法,建议大家还是称之为web标准. 学习本系列教程需有一定html和css基础,也 ...

  8. C#图像处理(4):图像的剪裁

    图像的剪裁方法,从中间剪裁返回剪裁后的左右两页,方法实现如下: /// <summary> /// 图片裁剪,返回左右两页 /// </summary> /// <par ...

  9. IE6 浏览器常见兼容问题 大汇总(23个)

    IE6以及各个浏览器常见兼容问题 大汇总 综述:虽然说IE6在2014年4月将被停止支持,但是不得不说的是,IE6的市场并不会随着支持的停止而立刻消散下去,对于WEB前端开发工程师来说,兼容IE6 兼 ...

  10. 百度地图HTML接口

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...