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

简介:   以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步。然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void类型,得不到返回结果,虽然有Completed的事件处理,但是还是感觉比较束缚,无法与前端交互。

  以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步。然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void类型,得不到返回结果,虽然有Completed的事件处理,但是还是感觉比较束缚,无法与前端交互。

  这里就跟大家分享一种传入回调函数的方法,把前台的方法写好,传到后台,让异步方法调用完成时执行。废话不多说了,开始写代码:

  首先,要先建一个带网站的sliverlight项目,这里就不细说了,在网站中添加一个Silverlight-enabled Wcf Service,随便写一个方法,就用自动生成的Dowork方法吧,下面是代码:

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;

namespace Silverlight.Web
{
   [ServiceContract(Namespace = "")]
   [SilverlightFaultBehavior]
   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
   public class Service
   {
      [OperationContract]
      public string DoWork()
      {
         // Add your operation implementation here
         return "OK,this WCF Server is running...";
      }

      // Add more operations here and mark them with [OperationContract]
   }
}

方法很简单,就是返回一个字符串,下面在Sliverlight中添加服务引用,引用刚才新建的服务,然后写一个测试方法,代码如下:

public void Test(Action<string> callback)
      {
         ServiceReference1.ServiceClient sc = new ServiceReference1.ServiceClient();
         sc.DoWorkAsync(callback);
         sc.DoWorkCompleted += new EventHandler<ServiceReference1.DoWorkCompletedEventArgs>(sc_DoWorkCompleted);
      }

这个方法调用了WCF服务的方法,并绑定了Completed的事件,这里需要注意的是,我们的WCF中的DoWork方法并没有任何参数,这里却传入了一个Action<T>委托,没错,这个就是回调函数,DoWorkAsync() 系统默认有个重载方法DoWorkAsync(object userState),有个参数为object userState,所以可以对这个参数赋值,把我们的回调函数传进去,下面是回调函数的调用:

 void sc_DoWorkCompleted(object sender, ServiceReference1.DoWorkCompletedEventArgs e)
      {
         CallBackMethod<string>(e,() => {return e.Result;});
      }

      public void CallBackMethod<T>(AsyncCompletedEventArgs e, Func<T> GetT)
      {
         if (e.UserState != null)
         {
            (e.UserState as Action<T>)(GetT());
         }
      }

这里是最精简的写法,当然可以自己扩展,添加错误处理等,使其功能变的更加强大,但这里主要就是使用了userState参数,传入了回调函数,从而执行的。

(e.UserState as Action<T>)(GetT());就是这句,把userState参数参数当作一个Action<T>委托执行。

接下来看看怎么使用吧,代码如下:
 private void button1_Click(object sender, RoutedEventArgs e)
      {
         Test(result =>
            {
               if (result != null)
               {
                  result += "  Haha,so eazy!";
                  MessageBox.Show(result);
               }
            });
      }

这里回调函数,我们传入lambda表达式,至此,回调函数就完成了。

在开发中,自己可以根据需要完善方法。

 
目录
相关文章
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
73 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
107 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
138 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
891 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1096 0
WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。
1035 0
|
网络架构
(纯代码)快速创建wcf rest 服务
因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBinding 2.
1012 0