c# - 匿名委托(delegate)可以在事件被触发后取消订阅吗?

标签 c# .net events delegates lambda

我想知道“最佳实践”是什么,要求事件处理程序在触发一次后取消订阅。

对于上下文,这是我的情况。用户已登录,并处于处理工作项的就绪状态。他们收到一个工作项,对其进行处理,然后再次准备就绪。此时,他们可能想说他们无法处理更多工作项目,但无论如何都会向他们发送一个。我希望能够做的是,一旦该操作成为可能,就允许用户“排队”“我不可用”。

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/

相关文章:

c# - 如何使用 SqlCommand 将多个 T-SQL 语句(由 GO 分隔)链接到对 SQL 的单个调用中

javascript - 事件在 FireFox 中未定义,但在 Chrome 和 IE 中可以

c# - 如何更改datagridview中的mysql查询?

c# - 扩展 WebService 代理类(从 WSDL 导入)方法

c# - 在现有文档中编辑范围 NumberFormat

c# - 在 .NET 中,是否可以根据函数调用设置事件

asp.net - UserControl 事件第一次不起作用

c# - 奇怪的尝试/捕捉行为

c# - 比较不同结构的数据

c# - Entity Framework - 一个 edmx 文件中的所有表