我在c# . net应用程序中遇到了一个挑战,我不知道如何解决。我有一个对象,它有一个名为Load的方法。如果对象加载成功,则触发一个事件。如果对象加载失败,则触发另一个事件。该实体定义如下:
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
}
}
现在,如果Load失败,我将对象存储在隔离存储中,以便稍后尝试加载它。当我稍后尝试加载对象时,我有以下代码:
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代码时,原始的Load_Failed和Load_Succeeded事件处理程序被执行。尽管我用的是"-="我做错了什么?我如何清除对象上的所有事件处理程序,以便我可以基本上重置它们?
谢谢!
只能在定义事件的对象上删除eventandler。这意味着你可以这样写:
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();
让我们按照以下方式编写代码,这是相同的代码,但更清晰:
<>之前MyEntity = GetFromIsolatedStorage();myEntity。Load_Failed -= new eventandler (this.myEntity_Load_Failed);myEntity。Load_Failed += new eventandler (this.myEntity_Load_Failed);之前-=操作符删除事件订阅,如果事件已经包含相同的订阅者:this.myEntity_Load_Failed。我不知道您的程序结构,但我认为本例中的事件有另一个订阅者(不是"this"),这一行没有任何影响。您需要将退订操作-=移到已知订阅者的位置