2011-08-24 32 views
0

我在我的C#.NET應用程序中遇到一個挑戰,我無法弄清楚如何解決。我有一個名爲「Load」的方法。如果對象成功加載,則會觸發一個事件。如果對象加載失敗,則會觸發另一個事件。這個實體定義如下:C# - 事件處理程序粘在內存中

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

從您的示例代碼中,舊的和新的「失敗」處理程序都稱爲「myEntity_Load_Failed」,那麼如何判斷它是被調用的「原始」處理程序? – Gabe

回答

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(); 
+0

太棒了!我不知道你可以這樣做!謝謝! – user609886

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。我不知道你的程序結構,但我認爲這種情況下的事件有另一個用戶(不是「this」),這條線沒有任何影響。您需要將取消訂閱操作 - =移到已知訂閱者的位置。