Josh Smith的MVVM示例应用程序中关于EventHandler的问题

3
以下代码来自Josh Smith的MVVM示例:
/// <summary>
/// Raised when this workspace should be removed from the UI.
/// </summary>
public event EventHandler RequestClose;

void OnRequestClose()
{
    //if (RequestClose != null)
    //        RequestClose(this, EventArgs.Empty);
    EventHandler handler = this.RequestClose;
    if (handler != null)
        handler(this, EventArgs.Empty);
 }

这些被注释的行是我添加的。我的问题是,这些被注释的行会和未被注释的行做同样的事情,对吗?那么为什么要创建另一个EventHandler引用呢?或者我漏掉了什么?谢谢。


1
为了防止多个线程尝试注册或取消注册事件时出现问题 - Tanmoy
请您详细说明或提供进一步阅读的链接吗?我不明白如何通过创建另一个对同一对象的引用来缓解这个问题。 - Aishwar
那会如何帮助呢?你有任何相关的参考资料吗?我没有看到任何可以帮助处理多线程的东西,除了由赋值引起的相对较小的延迟。 - Maxem
1
https://dev59.com/pHRB5IYBdhLWcg3wSVYI#672666 - Tanmoy
+1 谢谢链接,Tanmoy。如果您发布答案,我也可以点赞 :) - Aishwar
3个回答

4

Tanmoy是正确的。这样做是为了防止在您的“if”之后但在您的“RequestClose()”之前,在其他线程中更改RequestClose的可能性(例如更改为null)。


1

这没有区别 - 在两种情况下,您都在操作相同的事件引用。我更喜欢您有注释的代码。

享受!


1

RequestClose 可以被设置为 null 或另一个对象,可能是由另一个线程设置的,因为它是一个实例变量。将该值分配给局部变量意味着您始终拥有对事件的引用,并且它不会被其他线程更改。希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接