科技行者

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

知识库

知识库 安全导航

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

[冷枫]Remoting事件机制续

  • 扫一扫
    分享文章到微信

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

Remoting事件机制续

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

关键字: 冷枫 Remoting 事件机制

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

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

(1)关闭一个客户端以后会影响其他的客户端事件
原因:客户端没有取消事件订阅就关闭了,触发事件的时候找不到事件订阅者
解决:遍历委托链,找到异常的对象,从委托链中卸下
(2)服务器端对客户端广播,客户端能收到其他客户端的事件处理信息
原因:使用了Singleton模式,共享远程对象
解决:因为需要远程对象有状态且不共享实例,所以只有客户端激活可以选择

修改后的服务端:
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.ApplicationName
="RemoteObject.MyObject";
            RemotingConfiguration.RegisterActivatedServiceType(
typeof(RemoteObject.MyObject)); 
            BinaryServerFormatterSinkProvider serverProvider 
= new BinaryServerFormatterSinkProvider();  
            BinaryClientFormatterSinkProvider clientProvider 
= new BinaryClientFormatterSinkProvider();  
            serverProvider.TypeFilterLevel 
= TypeFilterLevel.Full;  
            IDictionary props 
= new Hashtable();  
            props[
"port"]=8888;  
            TcpChannel channel 
= new TcpChannel(props,clientProvider,serverProvider);  
            ChannelServices.RegisterChannel(channel);  
            Console.ReadLine(); 
        } 
    } 

修改后的远程对象:
using System; 

namespace RemoteObject 

    [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 string tmp;

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

        
protected void OnMyEvent(MyEventArgs e) 
        { 
            
if (MyEvent!=null
            { 
                
foreach(Delegate d in MyEvent.GetInvocationList())
                {
                    
try
                    {
                        ((MyEventHandler)d)(
this,e); 
                    }
                    
catch
                    {
                        MyEvent
-=(MyEventHandler)d;
                    }
                }
            } 
        } 
    } 

    
public class EventClass:MarshalByRefObject 
    { 
        
public void MyEvent(object sender,MyEventArgs e) 
        {
            
if(((MyObject)sender).tmp==e.IP)
                Console.WriteLine(
"异步方法完成了"+e.Rate*10+"%"); 
        }  
    } 

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

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

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