代码之家  ›  专栏  ›  技术社区  ›  AngryHacker

方法作用域变量的事件会发生什么?

  •  2
  • AngryHacker  · 技术社区  · 14 年前

    public class Bar {
        Foo foo;
        void Go() {
           foo = new Foo();
           foo.Send(...);
    
           foo.Dispose();
           foo = null; 
        }
    }
    
    public class Foo : IDisposable {   
        public void Send(byte[] bytes) {
            SocketAsyncEventArgs args = new SocketAsyncEventArgs();
            args.SetBuffer(bytes, 0, bytes.Length);
            args.UserToken = socket;
            args.RemoteEndPoint = endPoint;
            args.Completed += new EventHandler<SocketAsyncEventArgs>(OnSendCompleted);
    
            socket.SendAsync(args);
        }
    
        private void OnSendCompleted(object sender, SocketAsyncEventArgs e) {
            Debug.WriteLine("great");
        }
    
        public void Dispose() {
           //
        }
    }
    

    因此,class Bar运行Init方法,该方法实例化Foo类并触发Send方法,然后销毁Foo实例。Send方法同时实例化一个方法级别的SocketAsyncEventArgs,设置一个完成的事件,然后触发SendAsync方法。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    是的,它仍然会开火。将变量设置为null不会触发垃圾回收之类的操作。它只是将变量设置为null。(区分变量和实例很重要。没有“将实例设置为null”这样的概念。如果我把我的家庭住址写在一张纸上,然后再把它擦掉,那就不会毁了我的房子。)

    听起来你可能想 Dispose OnSendCompleted 处理后调用,忽略它即可。或者,跟踪任何“飞行中的请求”并在中取消它们 ... 注意到有些请求可能已完成 虽然

    还有一点需要注意:不是显式调用 Dispose() ,您几乎应该始终使用 using Dispose() 然而被称为 语句结束(例如,带有异常)。

        2
  •  1
  •   Larry    14 年前

    如果尝试使用 -=

    e.Completed -= new EventHandler<SocketAsyncEventArgs>(OnSendCompleted);