我在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事件处理程序。即使我使用“ - =”。我究竟做错了什么?如何清除对象上的所有事件处理程序,以便我可以基本上重置它们?
谢谢!
答案 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 。我不知道你的程序结构,但我认为在这种情况下该事件有另一个订阅者(不是“这个”),这行没有任何影响。您需要将取消订阅操作 - =移动到已知订户的位置。