第一次调用处理程序时分离处理程序
问题描述:
我想仅调用一次事件处理程序,然后将其分离。我试着写:第一次调用处理程序时分离处理程序
EventHandler handler = (s, e) =>
{
// Do something
//
// blabla
// Detach the handler
SizeChanged -= handler;
};
SizeChanged += handler;
但是上线SizeChanged -= handler
我得到这个错误
Use of unassigned local variable 'handler'
你对我应该如何进行idead?我想过使用布尔标志,但只有在找不到分离处理程序的方法时才会这样做。
答
这是因为它确实尚未分配。尝试制作一个命名方法,以便预先知道该符号。
private void OnEvent(object sender, EventArgs e)
{
// Do something
AnEvent -= OnEvent;
}
private void RegisterOnce()
{
AnEvent += OnEvent;
}
我也建议只detatch后运行DoSmething代码,并实现一些锁定机制,如果你有multithrading,以防止从多个线程调用在完全相同的活动时间内,没有时间来detatch并因此全部运行。
答
C#编译器将首先创建您在将结果分配给变量之前写入的lambda表达式。所以当lambda被定义时,处理程序没有值。
它的工作原理是,如果您之前为EventHandler分配了一个null值。
因为它是一个封闭和局部变量在封闭的拍摄,在呼叫处理程序的时候会产生正确的值,它会工作:
EventHandler handler=null;
handler = (s, e) =>
{
// Do something
SizeChanged -= handler;
};
SizeChanged += handler;
给所有的人downvoting:它赢得了不会导致NullReferenceException。 handler是一个在闭包中捕获的局部变量,所以当它在包含闭包的方法中发生变化时,lambda中的handler的值将会改变。我在我的电脑上测试了它,它完美地工作。
如果你这样做,你会在你的回调中产生空参考异常... – 2012-04-02 12:37:57
不,试试吧。处理程序在关闭中捕获。 – aKzenT 2012-04-02 12:38:46
嘿,在你尝试过之前不要投票给我!阅读关于如何关闭工作...... – aKzenT 2012-04-02 12:39:29