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

  以前学的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表达式,至此,回调函数就完成了。

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

 
时间: 2024-10-25 10:24:14

Silverlight中异步调用WCF服务,传入回调函数的相关文章

Silverlight同步(Synchronous)调用WCF服务

Silverlight的RIA应用中访问远端的WebService或WCF服务,都是通过异步线程模式调用的.在某些情况下我们的调用是需要同步进行,虽然Silverlight没有内置同步线程模式调用远端服务接口,但是我们可以通过多线程的处理来伪装出同步调用的实现.在.NET Framework的多线程编程中提供了丰富的线程接口,其中AutoResetEvent和ManualResetEvent在多线程编码中最为常用,本文将介绍如何通过AutoResetEvent的线程等待特性实现Silverlig

一起谈.NET技术,Silverlight同步(Synchronous)调用WCF服务

Silverlight的RIA应用中访问远端的WebService或WCF服务,都是通过异步线程模式调用的.在某些情况下我们的调用是需要同步进行,虽然Silverlight没有内置同步线程模式调用远端服务接口,但是我们可以通过多线程的处理来伪装出同步调用的实现.在.NET Framework的多线程编程中提供了丰富的线程接口,其中AutoResetEvent和ManualResetEvent在多线程编码中最为常用,本文将介绍如何通过AutoResetEvent的线程等待特性实现Silverlig

Silverlight同步(Synchro“.NET研究”nous)调用WCF服务

Silverlight的RIA应用中访问远端的WebService或WCF服务,都是通过异步线程模式调用的.在某些情况下我们的调用是需要同步进行,虽然Silverlight没有内置同步线程模式调用远端服务接口,但是我们可以通过多线程的处理来伪装出同步调用的实现.在.NET Framework的多线程编程中提供了丰富的线程接口,其中AutoResetEvent和ManualResetEvent在多线程编码中最为常用,本文将介绍如何通过AutoResetEvent的线程等待特性实现Silverlig

silverlight调用wcf服务

问题描述 在silverlight中调用wcf服务得到异步操作的结果为什么e.Rusult的值会ArrayOfElement,我在wcf中返回的是一个list<T>类型的,ArrayOfElement是什么类型啊,它总是提示无法将类型ArrayOfElement饮食转换为System.collection.IEnumerable,求解啊

wcf+silverlight 在ie10兼容模式下正常调用wcf服务,在标准模式下无法调用

问题描述 wcf+silverlight 在ie10兼容模式下正常调用wcf服务,在标准模式下无法调用 wcf+silverlight程序,在chrome,firfox,ie6-ie9下都能正常访问wcf服务,但是在ie10和ie11下访问wcf服务就报500错误了(我用fiddler监听看到的状态).还有在开发环境和部署在本地iis上是能正常访问的.部署到服务器后在ie10和ie11兼容模式下也可以正常访问. 我想问为什么部署到服务器后在ie10和ie11标准模式下无法调用wcf服务? 网站:

不要在using语句中“.NET研究”调用WCF服务

如果你调用WCF服务时,像下面的代码这样在using语句中进行调用,需要注意一个问题. using (CnblogsWcfClient client = new CnblogsWcfClient()){ client.Say("Hello, cnblogs.com!");} 上面这段代码看上去没问题,CnblogsWcfClient是一个自动生成的WCF客户端代理,继承自System.ServiceModel.ClientBase.using语句结束时,会调用ClientBase实现的

iPhone中调用WCF服务

由于对移动平台充满着好奇与兴趣,最近着手了iPhone开发的学习.学习的路线是从objective-c到cococa.方法是看了两本入门的英文书,还有就是学习apple的sdk.对于产品的基本想法是服务端用.net,手机客户端用iPhone. 一些复杂的逻辑处理放到服务端实现,客户端与服务端通过XML交互,在iPhone客户端解析XML通过cocoa展示数据.由于iPhone和DoNet是两个完全不同的平台.iPhone依靠mac系统平台,donet依赖windows系统平台.这篇文章我将通过一

iPhone中调用WCF服务“.NET研究”

由于对移动平台充满着好奇与兴趣,上海网站建设最近着手了上海闵行企业网站制作iPhone开发的学习.学习的路线是从objective-c到cococa.方法是看了两本入门的英文书,还有就是学习apple的sdk.对于产品的基本想法是服务端用.net,手机客户端用iPhone. 一些复杂的逻辑处理放到服务端实现,客户端与服务端通过XML交互,在iPhone客户端解析XML通过cocoa展示数据.由于iPhone和DoNet是两个完全不同的平台.iPhone依靠mac系统平台,donet依赖windo

一起谈.NET技术,不要在using语句中调用WCF服务

如果你调用WCF服务时,像下面的代码这样在using语句中进行调用,需要注意一个问题. using (CnblogsWcfClient client = new CnblogsWcfClient()){ client.Say("Hello, cnblogs.com!");} 上面这段代码看上去没问题,CnblogsWcfClient是一个自动生成的WCF客户端代理,继承自System.ServiceModel.ClientBase.using语句结束时,会调用ClientBase实现的