科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[冷枫]Remoting的事件机制

[冷枫]Remoting的事件机制

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Remoting的事件机制(带具体例子)

作者:冷枫 来源:CSDN 2007年9月23日

关键字: 冷枫 Remoting 事件机制

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

概念就不说了,具体参见msdn相关章节:
http://msdn.microsoft.com/library/CHS/cpguide/html/cpconEvents.asp

我们先来改造一下上次的程序,为上次的主线程方法添加事件,能不断的引发事件来汇报处理的进度:
public class MyEventArgs
{
    
private int _rate;
    
    
public int Rate
    {
        
get
        {
            
return _rate;
        }
    }

    
public MyEventArgs(int rate)
    {
        
this._rate=rate;
    }
}

public class MyObject
{
    
public delegate void MyEventHandler(object sender,MyEventArgs e);
    
public event MyEventHandler MyEvent;

    
public void ALongTimeMethod(int time)
    {
        Console.WriteLine(
"主线程方法开始");
        
for(int i=0;i<100;i++)
        {
            System.Threading.Thread.Sleep(time);
            OnMyEvent(
new MyEventArgs(i));
        }
        Console.WriteLine(
"主线程方法结束");
    }

    
protected void OnMyEvent(MyEventArgs e)
    {
        
if (MyEvent!=null)
        {
            MyEvent(
this,e);
        }
    }
}

再来为事件添加处理程序:

class MyClient
{
    [STAThread]
    
static void Main(string[] args)
    {
        DateTime dt
=DateTime.Now;
        MyObject obj
=new MyObject();
        obj.MyEvent
+=new MyObject.MyEventHandler(obj_MyEvent);
        obj.ALongTimeMethod(
50);
        Console.WriteLine(
"用了"+((TimeSpan)(DateTime.Now-dt)).TotalSeconds+"");
        Console.ReadLine();
    }

    
public static void obj_MyEvent(object sender,MyEventArgs e)
    {
        Console.WriteLine(
"主线程方法完成了"+e.Rate+"%");
    } 
}

运行程序可以看到:

这个是本地的,远程对象的事件也这么简单吗?其实没有想象的简单,因为对象是在远程的,服务端的事件客户端怎么捕捉?应该说远程对象的事件可以分成客户端触发-》服务器应答,服务端触发-》客户端应答和客户端触发-》客户端应答,第一种就很简单了,后面2种都需要有一个中间件。下面我们来要为程对象同样来添加一个进度机制,首先来建立我们的远程对象:

[Serializable]
    
public class MyEventArgs:EventArgs
    {
        
private int _rate;
        
private string _ip;

        
public int Rate
        {
            
get
            {
                
return _rate;
            }
        }

        
public string IP
        {
            
get
            {
                
return _ip;
            }
        }

        
public MyEventArgs(int rate,string ip)
        {
            
this._rate=rate;
            
this._ip=ip;
        }
    }

    
public class MyObject:MarshalByRefObject
    {
        
public delegate void MyEventHandler(object sender,MyEventArgs e);
        
public event MyEventHandler MyEvent;

        
public int ALongTimeMethod(int a,int b,int time,string ip)
        {
            Console.WriteLine(
"异步方法开始");
            
for(int i=0;i<10;i++)
            {
                System.Threading.Thread.Sleep(time);
                OnMyEvent(
new MyEventArgs(i,ip));
            }
            Console.WriteLine(
"异步方法结束");
            
return a+b;
        }

        
protected void OnMyEvent(MyEventArgs e)
        {
            
if (MyEvent!=null)
            {
                MyEvent(
this,e);
            }
        }
    }

为了调试方便,服务器端和客户端这次都用程序实现,下面是服务器端:
using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization.Formatters;

namespace RemoteServer
{
    
class MyServer
    {
        [STAThread]
        
static void Main(string[] args)
        {
            RemotingConfiguration.RegisterWellKnownServiceType(
typeof(RemoteObject.MyObject),"RemoteObject.MyObject",WellKnownObjectMode.Singleton);
            BinaryServerFormatterSinkProvider serverProvider 
= new BinaryServerFormatterSinkProvider(); 
            BinaryClientFormatterSinkProvider clientProvider 
= new BinaryClientFormatterSinkProvider(); 
            serverProvider.TypeFilterLevel 
= TypeFilterLevel.Full; 
            IDictionary props 
= new Hashtable(); 
            props[
"port"]=9999
            TcpChannel channel 
= new TcpChannel(props,clientProvider,serverProvider); 
            ChannelServices.RegisterChannel(channel); 
            Console.ReadLine();
        }
    }
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章