【问题标题】:Question on EventHandler from Josh Smith's MVVM sample applicationJosh Smith 的 MVVM 示例应用程序中有关 EventHandler 的问题
【发布时间】:2010-09-21 04:07:26
【问题描述】:

以下代码来自 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 的链接,如果您发布答案,我也可以投票:)

标签: c# wpf mvvm event-handling


【解决方案1】:

Tanmoy 是对的。这样做是为了防止在“if”之后但在“RequestClose()”之前在其他线程中更改 RequestClose(例如变为 null)。

【讨论】:

    【解决方案2】:

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

    享受吧!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多