2011-08-24 9 views
0

C#.NETアプリケーションでは解決方法がわかりません。私は "Load"というメソッドを持つオブジェクトを持っています。オブジェクトが正常にロードされた場合は、1つのイベントが発生します。オブジェクトの読み込みに失敗すると、別のイベントが発生します。ロードが失敗した場合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。あなたのプログラムの構造はわかりませんが、この場合のイベントには別のサブスクライバ(「これ」ではなく)があり、この行には何の効果もありません。あなたは加入者が知られているところに、加入解除操作を移す必要があります。

関連する問題