您的位置:首页 > 其它

WCF从理论到实践(8):事件广播

2008-02-24 12:06 525 查看
上文讨论了WCF中三种消息交换模式,one-way,request/reply,duplex。前两项比较简单,无需多言,duplex相对比较复杂,上文只是实现了简单的回调,在真正应用的时候,还有许多值得注意之处,本文就结合一个实际的应用例子来谈论下duplex的具体应用和非常值得我们注意的地方。

本文的出发点

通过阅读本文,您能理解以下知识:

如何实现一个基于duplex的事件广播
解析在实现duplex事件广播中的几个问题
初步探讨一下异步

本文适合的读者

本文属于中等难度的文章,需要有WCF消息交换和windows应用程序开发相关的基础知识,有关WCF消息交换,请阅读/article/4598899.html

如何实现一个基于duplex的事件广播

在讨论如何实现之前,先看一下本文的范例所要实现的功能是什么?本文的范例实现了一个简单的分布式任务管理系统,简单的说,它是在服务端(Server Point)执行任务(Job),并且将任务的信息呈现给客户端。它有如下特征:

通过调用服务端的Accept(),客户端能连接上服务端,并保持会话。
客户端在启动的时候,可以通过远程调用GetJobs()来获取当前服务端中全部的任务,并将这些任务在客户端窗体中用列表控件呈现出来
客户端能通过调用AddJob()向服务端添加任务,当服务端完成添加操作之后,引发添加完成的事件,并向全部的客户端广播该事件
当客户端服务端发来的添加新任务事件广播的时候,客户端将新增任务添加到列表控件加以呈现
客户端可以命令服务端执行具体某个任务,当任务在开始执行和执行结束后,服务端都会像全部客户端广播任务的执行情况,并且任务的执行和事件的广播异步执行
客户端收到广播后,便可以更新任务信息。

和以前文章不同,本文先给出最后实现的效果

private void BroadcastEvent(CallbackEventArg e, ServerEventHanlder temp)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

namespace Jillzhang.Event.Core

{

{

[OperationContract(IsOneWay = true, IsInitiating = true, IsTerminating = false)]

void Accept();

[OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=false)]

void Do(string jobName);

[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]

void AddJob(Job job);

[OperationContract(IsOneWay=false,IsInitiating=false,IsTerminating=false)]

List<Job> GetJobs();

}

}

初步探讨一下异步


进程间通讯是一件很耗时的事情,如果同步执行会造成线程的阻塞,如果是在服务端,会降低服务的处理能力(这种说法可能有些问题,我会进一步求证,估计保留,经过查证多线程在服务端的好处在于提供对单个请求用多个线程处理的能力,从而防止完成一个请求之前,无法接受新的请求),如果是在客户端,会给用户带来不好的体验。下面就分别探讨一下如何实现服务端和客户端的异步。

在服务端,一个事件的异步可以通过delegate的BeginInvoke和EndInvoke来实现,具体方法可以参见示例项目Jillzhang.Event.Service中的Server对象的方法BroadcastEvent方法的实现

而在客户端,我们可以起多个线程,当然最方便快捷的办法就是使用BackGroundWorker后台线程来处理耗时比较长的操作了,具体实现也可以参考Jillzhang.Event.Client项目中的Form1.cs实现。

本文的参考资料

/article/4591847.html
http://www.cnblogs.com/caishiqi/archive/2007/10/05/914671.html
http://msdn.microsoft.com/msdnmag/issues/06/10/wcfessentials/default.aspx

本文中的范例

范例最终实现:/Files/jillzhang/Jillzhang.Event.rar


原来的示例代码中,采用的Binding为NetTcpBinding,有朋友问用WsDualHttpBinding的时候出现异常,也作了一个示例

/Files/jillzhang/Jillzhang.Event_WsDualHttpBinding.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: