是不是可以这样理解
+=不过委托过去一个要执行的方法所在的地址之类的信息
虽然你aClass1  = null;
但是其实以前的那个aClass1还在被引用,所有没有被回收.....

解决方案 »

  1.   

    this.ShowMessageEvent += new MessageEventHandler
    改为(没Copy上):
    this.ShowMessageEvent += new MessageEventHandler(aClass1.ShowMessage);
      

  2.   

    你是不是写了构造函数
    public delegate void ChangedEventHandler(object sender, string c);
    public class ComTerm
    {
    MSComm com = new MSComm();
    public event ChangedEventHandler Changed; //定义一个事件用委托来处理

    public ComTerm()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    com.OnComm += new MSCommLib.DMSCommEvents_OnCommEventHandler(this.Receive);
    InitComPort(2,9600);
    } //to call underlying com class/method to send command to com port   **
    public bool Send(string sSendMsg) //
    { //
    if(sSendMsg != "") //
    { //
    com.Output = sSendMsg; //
    return true; //
    } //
    else //
    return false; //
    } //
    //*************调用以下  com类/以将命令发送到 com 口 *****************

    //close com port
    //Receive method to receive data from underlying class from com port
    public void Receive()   //
    {

    if (Changed != null)
    {
    if(com.InBufferCount > 0)////
    {
    string strAnalyze = com.Input.ToString();

    Changed(this,strAnalyze);
    }
    }


    } public void InBufferCountClear()
    {
    com.InBufferCount = 0;
    }
    //叫串口滚
    public void comClose()
    {
    if(com.PortOpen)
    com.PortOpen = false;
    }

    //}  public string comdata(string input)
    {
       
    string putin = (input + "\n");
    return putin;
    }

    //*************  接收方法从一个串口的优先类接收数据 ****************
     

    private void OnComm(object sender, EventArgs e)  //  MSCommLib OnComm Event Handler
    {
    // If data is waiting in the buffer, process it.
    // Note: This is using the string method for simple data, be sure
    //       to use byte arrays (described below) for more generic data.
    if (com.InBufferCount > 0) 
    com.Input.ToString();
    }
    //PortSetting to setup port parameter such as portNumber and baudRate etc
    //设置端口参数,如端口号和波特率等
    public void InitComPort(short iPort,int iBaudRate)
    {
    // This port is already open, close it to reset it.
    /*if(com.PortOpen)
    {
    throw(new ApplicationException("This port has already been opened!"));
    }*/
    if (com.PortOpen) 
    com.PortOpen = false; // Set the com port to be 1
    //设置端口号
    com.CommPort = iPort;   
    // Trigger the OnComm event whenever data is received
    com.RThreshold = 1;  
    // Set the port to 9600 baud, no parity bit, 8 data bits, 1 stop bit (all standard)
    com.Settings = iBaudRate + ",n,8,1"; // Force the DTR line high, used sometimes to hang up modems
    com.DTREnable = true;
        
    // No handshaking is used
    com.Handshaking = MSCommLib.HandshakeConstants.comNone; // Don't mess with byte arrays, only works with simple data (characters A-Z and numbers)
    com.InputMode = MSCommLib.InputModeConstants.comInputModeText;
        
    // Use this line instead for byte array input, best for most communications
    com.InputMode = MSCommLib.InputModeConstants.comInputModeText;
        
    // Read the entire waiting data when com.Input is used
    com.InputLen = 0; com.OutBufferSize = 1024; // Don't discard nulls, 0x00 is a useful byte
    com.NullDiscard = false;
    // Attach the event handler
    //com.OnComm += new System.EventHandler(this.OnComm);
    //com.OnComm += new MSCommLib.DMSCommEvents_OnCommEventHandler(this.OnComm);
    // Open the com port
    try
    {
    com.PortOpen = true;  
    com.OnComm += new MSCommLib.DMSCommEvents_OnCommEventHandler(this.Receive);
    }
    catch (Exception e)
    {
    Console.WriteLine("{0} Exception caught.", e);
    }
     
    //com.Changed += new ChangedEventHandler(ReceiveData);
    }
    }
    }
    窗体调用的时候private ComTerm com = new ComTerm();
    ReceivePacket rep = new ReceivePacket();
    public Mainfrm()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent();
    com.Changed += new ChangedEventHandler(this.OnComm); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    }
    private void OnComm(object sender, string s)
    {
    //s += s;
    if(s.Length == 173)
    {
    com.InBufferCountClear();
    s = "$AMD" + s;
    string bbc = "101010";
    int rrr = int.Parse(bbc.Substring(0,4));
    rep.Analyze(s);
    }

    }
      

  3.   

    同意 brightheroes(闭关|那一剑的风情) 的说法!
      

  4.   

    brightheroes(闭关|那一剑的风情)我也是这么想的,其实引出这个问题是关于Remoting的事件处理上的,远程客户端注册了服务器端的一个事件,如果此后出现了网络故障,客户端就不能主动-=掉注册,服务器端就会有异常了。另外这些问题都可以通过异常处理来消除掉,只是不明白其中的道理。
      

  5.   

    aClass1,args都是类里面的变量了,
      

  6.   

    嗯,其实在Remoting中,采用事件的处理也不是解决服务器主动发给客户端消息的唯一做法我之前曾经做了一个尝试比如说,我有一个User类,是在客户端NEW的我可以让User类继承System.MarshalByRefObjectNew他的同时,加载到Server端的一个ArrayList里面(好像有点观察者模式的意思,呵呵)然后在Server端,可以任意的调用某个User的公开方法关于Remoting,我推荐一个感觉很好的Blog,可以去看看http://www.cnblogs.com/wayfarer/category/1235.htmlBTW:偏题了不少,呵呵
      

  7.   

    C++程序员会很容易理解这件事情。把aClass1看作一个指针,当指针aClass1=null的时候,内存里面的对象其实还是存在的,所以此时当然可以调用这个对象的方法。
      

  8.   

    牛,刚才我还很是迷惑,多谢大家!!!
    特别是brightheroes(闭关|那一剑的风情)CSDN真是大家交流思想答疑解惑的好地方,祝大家共同进步!