我想知道“最佳实践”是什么,要求事件处理程序在触发一次后取消订阅。
对于上下文,这是我的情况。用户已登录,并处于处理工作项的就绪状态。他们收到一个工作项,对其进行处理,然后再次准备就绪。此时,他们可能想说他们无法处理更多工作项目,但无论如何都会向他们发送一个。我希望能够做的是,一旦该操作成为可能,就允许用户“排队”“我不可用”。
public event SomeHandler StateChanged = delegate {};
public void QueueNotAvailable()
{
StateChanged += (s,e) => {
if (e.CanGoNotAvailable) {
someObject.NotAvailable();
StateChanged -= {thishandler};
}
}
}
就我而言,如果一个单独的线程碰巧触发了事件并且这个特定的处理程序运行了两次,这不是问题。非常接近地请求相同的功能是可以接受的。我只是不希望它在每次允许操作时触发。
最佳答案
您可以在订阅事件之前保存委托(delegate)实例:
public void QueueNotAvailable()
{
SomeHandler handler = null;
handler = (s,e) {
// ...
StateChanged -= handler;
};
StateChanged += handler;
}
我相信这应该做到...我必须将初始 handler = null
放在那里,否则你会得到“使用未分配的局部变量”编译错误,但我认为它实际上是良性的。
关于c# - 匿名委托(delegate)可以在事件被触发后取消订阅吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3082143/