C# - 事件处理程序粘在内存中

时间:2011-08-24 11:45:31

标签: c# events event-handling

我在C#.NET应用程序中遇到了一个挑战,我无法弄清楚如何解决。我有一个对象,有一个名为“加载”的方法。如果成功加载对象,则会触发一个事件。如果对象无法加载,则会触发另一个事件。该实体定义如下:

public class MyEntity
{
  public event EventHandler Load_Succeeded;
  public event EventHandler Load_Failed;
  public void Load()
  {
    /*
     Asynchronously load the entity code here.
    */
  }

  private void Load_Completed(IAsyncResult result)
  {
    // Fire Load_Succeeded or Load_Failed
  }
}

现在,如果加载失败,我将对象存储在隔离存储中以尝试稍后加载它。当我稍后尝试加载对象时,我有以下代码:

MyEntity myEntity = GetFromIsolatedStorage();
myEntity.Load_Failed -= new EventHandler(myEntity_Load_Failed);
myEntity.Load_Failed += new EventHandler(myEntity_Load_Failed);

myEntity.Load_Succeeded -= new EventHandler(myEntity_Load_Succeeded);
myEntity.Load_Succeeded += new EventHandler(myEntity_Load_Succeeded);
myEntity.Load();

奇怪的是,当我通过从隔离存储加载的实体运行加载代码时,将执行原始的Load_Failed和Load_Succeeded事件处理程序。即使我使用“ - =”。我究竟做错了什么?如何清除对象上的所有事件处理程序,以便我可以基本上重置它们?

谢谢!

2 个答案:

答案 0 :(得分:2)

您只能在定义事件的对象上删除eventHandler。这意味着你可以使用它:

    public class MyEntity
{
  public event EventHandler Load_Succeeded;
  public event EventHandler Load_Failed;
  public void Load()
  {
    /*
     Asynchronously load the entity code here.
    */
  }

  private void Load_Completed(IAsyncResult result)
  {
    // Fire Load_Succeeded or Load_Failed
  }

  public void ResetEvents()
  {
        this.Load_Succeeded = null;
        this.Load_Failed = null;
  }

}

然后只需致电

myEntity.ResetEvents();

答案 1 :(得分:1)

让我们按照以下方式编写代码,这是相同的代码,但更清楚:

MyEntity myEntity = GetFromIsolatedStorage(); 
myEntity.Load_Failed -= new EventHandler(this.myEntity_Load_Failed);
myEntity.Load_Failed += new EventHandler(this.myEntity_Load_Failed); 

- =运算符会删除事件订阅,如果事件已包含相同的订阅者: this.myEntity_Load_Failed 。我不知道你的程序结构,但我认为在这种情况下该事件有另一个订阅者(不是“这个”),这行没有任何影响。您需要将取消订阅操作 - =移动到已知订户的位置。