.NET Remoting Basic(8)-事件
2010-08-26 22:58 Clingingboy 阅读(465) 评论(0) 编辑 收藏 举报远程事件也需要转化成消息,所以也需要加事件委托继承自MarshalByRefObject。实际操作如下
1.定义接口
public delegate void MessageArrivedHandler(String msg); public interface IBroadcaster { void BroadcastMessage(String msg); event MessageArrivedHandler MessageArrived; }
2.服务器端实现
public class Broadcaster: MarshalByRefObject, IBroadcaster { public event General.MessageArrivedHandler MessageArrived; public void BroadcastMessage(string msg) { // call the delegate to notify all listeners Console.WriteLine("Will broadcast message: {0}"); MessageArrived(msg); } public override object InitializeLifetimeService() { // this object has to live "forever" return null; } } class ServerStartup { static void Main(string[] args) { String filename = "server.exe.config"; RemotingConfiguration.Configure(filename); Console.WriteLine ("Server started, press <return> to exit."); Console.ReadLine(); } }
上面两步没多大悬念,关键在客户端
3.客户端实现
3.1定义一个继承自MarshalByRefObject的委托方法
public class EventHandler: MarshalByRefObject { public void HandleMessage(String msg) { Console.WriteLine("Received: {0}",msg); } public override object InitializeLifetimeService() { // this object has to live "forever" return null; } }
3.2调用事件时,委托接收的方法应是继承自MarshalByRefObject的方法
static void Main(string[] args) { String filename = "eventlistener.exe.config"; RemotingConfiguration.Configure(filename); IBroadcaster bcaster = (IBroadcaster) RemotingHelper.GetObject(typeof(IBroadcaster)); Console.WriteLine("Registering event at server"); // callbacks can only work on MarshalByRefObjects, so // I created a different class for this as well EventHandler eh = new EventHandler(); bcaster.MessageArrived += new MessageArrivedHandler(eh.HandleMessage); Console.WriteLine("Event registered. Waiting for messages."); Console.ReadLine(); }
上面的方法将会报错
在中间层加入一个事件,由事件触发获取内部委托,由内部对象触发事件,不可以直接触发,一定要在中间层,不可以直接在客户端添加
public class BroadcastEventWrapper : MarshalByRefObject { public event MessageArrivedHandler MessageArrivedLocally; [OneWay] public void LocallyHandleMessageArrived(String msg) { // forward the message to the client MessageArrivedLocally(msg); } public override object InitializeLifetimeService() { // this object has to live "forever" return null; } }
调整后如下
static void Main(string[] args) { String filename = "eventlistener.exe.config"; RemotingConfiguration.Configure(filename); IBroadcaster bcaster = (IBroadcaster) RemotingHelper.GetObject(typeof(IBroadcaster)); BroadcastEventWrapper eventWrapper =new BroadcastEventWrapper(); // register the local handler with the "remote" handler eventWrapper.MessageArrivedLocally +=new MessageArrivedHandler(HandleMessage); Console.WriteLine("Registering event at server"); bcaster.MessageArrived +=new MessageArrivedHandler(eventWrapper.LocallyHandleMessageArrived); Console.WriteLine("Event registered. Waiting for messages."); Console.ReadLine(); } public static void HandleMessage(String msg) { Console.WriteLine("Received: {0}", msg); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2009-08-26 Spring.NET学习笔记(6)-基础AOP