如何实现异步调用WCF

在面向服务的.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~

时间: 2024-08-29 16:43:18

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

WPF异步调用WCF服务

wpf调用wcf时,第一次访问总耗时到达几秒,影响界面的用户体验,因此在wpf加载界面和加载数据时采用异步加载,即异步访问wcf服务, 由于是否采用异步加载和服务端无关,仅仅由客户端自己根据需要来选择,则我们只需要在客户端(WPF)程序中采用异步的方法.如下: //1.创建一个异步对象,访问wcfFunc<string, string, List<NodeItem>> GetDataFromWCF = new Func<string, string, List<Node

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

以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void类型,得不到返回结果,虽然有Completed的事件处理,但是还是感觉比较束缚,无法与前端交互. 这里就跟大家分享一种传入回调函数的方法,把前台的方法写好,传到后台,让异步方法调用完成时执行.废话不多说了,开始写代码: 首先,要先建一个带网站的sliverlight项目,这里就不细说了,在网站中添加

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

本文参考自http://www.cnblogs.com/wangweimutou/p/4409227.html,纯属读书笔记,加深记忆 一.简介 在前面的随笔中,详细的介绍了WCF客户端服务的调用方法,但是那些操作全都是同步的,所以我们需要很长的时间等待服务器的反馈,如何一台服务器的速度很慢,所以客户端得到结果就需要很长的时间,试想一下,如果客户端是个web项目,那么客户体验可想而知,所以为了不影响后续代码执行和用户的体验,就需要使用异步的方式来调用服务.注意这里的异步是完全针对客户端而言的,与

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

前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码部分的执行,这时我们就需要考虑使用异步的方式来调用服务.注意这里的异步是完全针对客户端而言的,与WCF服务契约的方法是否异步无关,也就是在不改变操作契约的情况下,我们可以用同步或者异步的方式调用WCF服务. WCF客户端异步调用服务方式: 通过代理类异步调用服务.就需要通过使用事件驱动的异步调用模型

WCF的异步调用

1.服务契约 namespace Contracts { [ServiceContract] public interface ICalculator { [OperationContract] double Add(double x,double y); } } 2.服务实现 namespace Services { public class CalculatorService:ICalculator { public double Add(double x, double y) { retu

Android基于ksoap2调用WCF服务(二):Android篇

上一篇通过一个非常简单的例子,完成了一个WCF的服务.接下来介绍一下Android端. Android端调用WCF,采用基于ksoap2包来实现. 下载地址(这个需要fan qiang访问,你们懂的):https://code.google.com/p/ksoap2-android/ 我用的3.3.0版本,我传到csdn上,上面地址如果不能访问,可以用这个地址:http://download.csdn.net/detail/cnryc/7695437 程序的源代码下载地址:http://down

客户端的异步调用

C#客户端的异步操作 阅读目录 开始 示例项目介绍 同步调用服务 异步接口介绍 1. 委托异步调用 2. 使用IAsyncResult接口实现异步调用 3. 基于事件的异步调用模式 4. 创建新线程的异步方式 5. 使用线程池的异步方式 6. 使用BackgroundWorker实现异步调用 客户端的其它代码 各种异步方式的优缺点 异步文件I/O操作 数据库的异步操作 异步设计的使用总结 在Asp.net中使用异步 上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但

.Net 异步调用

.NET异步编程之新利器——Task与Await.Async 一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程. 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用. 使用

【Win 10应用开发】手动调用WCF服务

调用服务最简单的方法就是,直接在VS里面添加服务引用,输入服务的地址即可,无论是普通Web服务,还是WCF服务均可.VS会根据获取到的元数据,自动生成客户端代码. 如果服务的调用量很大,应用广泛,可以放在IIS上作为一种Web资源使用.但WCF不限于此,它可以在一个进程中运行,或者可以放到Windows服务进程上运行,实则是一种Windows平台的万能通信技术. 为了装逼,今天老周将演示如何手动调用WCF,仅通过Channel(通道)就可以调用.其实,在某些时候,手动也有手动的好处,手动调用的话