c# - 将事件设置为空

标签 c# winforms events .net-4.0

我有这样的代码:

public class SomeClass
{
    int _processProgress;
    public int ProcessProgress 
    { 
        get { return _processProgress; } 
        set 
        { 
            _processProgress = value; 
            if (ProcessProgressChanged != null) 
                ProcessProgressChanged(value);
        } 
    }

    public delegate void ProcessProgressChangedEventHandler(int progressPercentage);
    public event ProcessProgressChangedEventHandler ProcessProgressChanged;

    public void ClearProcessProgressChangedEvent()
    {
        this.ProcessProgressChanged = null;
    }
}

当我调用 ClearProcessProgressChangedEvent() 方法时,是否会取消订阅 ProcessProgressChanged 事件中的所有方法?

我的代码在 C# 中,框架 4,在 VS2010 Pro 中构建,项目在 Winforms 中。

请帮忙。提前致谢。

最佳答案

好吧,它会有效地清除订阅者列表,是的(通过将底层委托(delegate)字段设置为 null)- 这样下次设置 ProcessProgress 时,不会调用任何处理程序。它并没有真正将 event 设置为 null - 它正在将基础字段设置为 null。只是 C# 编译器使用单个声明创建一个事件(一对订阅/取消订阅方法)和一个字段(用于存储处理程序)。

你可以找到我的 article about events and delegates有用。

请注意,您的事件引发代码目前不是线程安全的。我不知道是否需要这样做,但您可能希望考虑使用:

set 
{ 
    _processProgress = value; 
    var handlers = ProcessProgressChanged;
    if (handlers != null) 
    {
        handlers(value);
    }
}

如果最后一个处理程序在无效性检查之后调用之前取消订阅,那么您将不会得到NullReferenceException。 p>

关于c# - 将事件设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513292/

相关文章:

c# - 使用 EnumWindows 在 WinForm 的面板内启动 .exe 应用程序 - 而不是记事本

Javascript 事件调用者未被传递到参数中

mysql - 基于 session 计数器配对事件并在 mySQL 中查找时间增量

c# - WPF 动画不适用于 "fast"属性更改

c# - Entity Framework 选择查询

c# - 组合框 DropDownStyle DropDownList : Change BackColor WinForms

javascript - 确定何时加载 IFrame 的内容

c# - 音频采样率计时

c# - 如何初始化 ConcurrentDictionary?错误 : "Cannot access private method ' Add' here"

c# 从控制台应用程序显示窗口窗体