相关疑难解决方法(0)

安全地提升事件线程 - 最佳实践

为了引发事件,我们使用OnEventName方法,如下所示:

protected virtual void OnSomethingHappened(EventArgs e) 
{
    EventHandler handler = SomethingHappened;
    if (handler != null) 
    {
        handler(this, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这个有什么不同?

protected virtual void OnSomethingHappened(EventArgs e) 
{
    if (SomethingHappened!= null) 
    {
        SomethingHappened(this, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然第一个是线程安全的,但为什么以及如何?

没有必要开始一个新线程?

c# event-handling

38
推荐指数
6
解决办法
3万
查看次数

事件处理程序和空条件运算符

例如,实现INotifyPropertyChanged接口:

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null)
        handler.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)

两件事情:

  1. 将事件复制到本地变量以防止多线程错误(这里有一些示例).如果不复制到局部变量,Resharper会发出通知:

可能的NullReferenceException

  1. 检查它是否为null,以防止 NullReferenceException

但是现在,我们可以使用?.运算符进行空值检查.如果我使用它,Resharper是空闲的: 没有错误

所以,问题是:ProperyChanged如果我使用空条件运算符,我应该将事件复制到局部变量吗?

.net c# resharper event-handling

7
推荐指数
1
解决办法
1852
查看次数

标签 统计

c# ×2

event-handling ×2

.net ×1

resharper ×1