2011-07-12 24 views
1

我有一个派生自System.Windows.Form.Form的“MyForm”。 MyForm处理FormClosed事件,该事件的处理程序是在构造函数中设置的。实例化的MyForm对象是否可以使用 - =成功地删除我的MyClass#FormClosed处理程序?如果重要,我使用匿名方法来连接我的FormClosed事件。从类实例派生类中删除( - =)Form#FormClosed事件添加(+ =)?

// In MyForm Constructor, this ALWAYS gets fired... 
FormClosed += (_sender, _args) => { m_mutex.Dispose(); m_mutex = null; }; 

// In Instantiating Class 
MyForm form = new MyForm(); 
form.FormClosed += (_sender, _args) => { }; 

// I have also tried using "delegate(object sender, EventArgs e)" and neither worked. 
+0

也许提供您当前订阅和取消订阅的样本... ???而且,你自己试过这个吗? – IAbstract

+0

[Event event fires more times times]可能的重复(http://stackoverflow.com/questions/6200424/event-fires-more-and-more-times) –

+0

@Abstract - 我试过了我相信的东西成为正确的匿名签名,但未成功删除。 – gangelo

回答

3

是的,你可以删除它 - 但如果你已经使用了匿名函数,它有点棘手。

基本上你会要么需要停止使用匿名函数(即把行为放到一个方法)你需要有一个字段存储代表的价值:

private EventHandler formClosedHandler; 
... 

// In constructor 
formClosedHandler = (sender, args) => { ... }; 
FormClosed += formClosedHandler; 

// Later... 
FormClosed -= formClosedHandler; 
formClosedHandler = null; 

个人而言,我倾向于将逻辑转移到方法中,除非由于某些原因它非常棘手。

+0

我感到很高兴,这是我打字的答案:)谁会想我会像Jon Skeet一样思考? – ckramer

+0

我已经对这种形式变得很自在了:'formClosedHandler =(sender,args)=> {...};'。这使得处理un-subbing&cleanup非常容易。 – IAbstract

0

是的,您可以退订任何事件,即使在Disposed()方法中也是如此。