2017-07-10 10 views
0

クラスAにイベントがあります。クラスBはそれを購読したい。クラスBにはイベントがあり、クラスAはそのイベントに登録したいと考えています。c#classesお互いのイベントをサブスクライブする

クラスBのオブジェクトをAに、クラスAのオブジェクトをBで作成しようとしましたが、デッドロックです。私はここに助けが必要

...

Please check this image

グレーの長方形がイベントでなければなりません。矢印は、イベントがクラスここ

class A 
{ 
B b; 
public event EventHandler eventA; 

OnEventA() 
{ 
eventA(); 
} 

public A() 
{ 
b= new B(); 
b.eventB += DoSomethingElse(); 
} 

} 


class B 
{ 
A a; 
public B() 
{ 
    a= new A(); 
    a.eventA += DoSomething(); 
} 
public event EventHandler eventB; 

OnEventB() 
{ 
eventB(); 
} 


} 
+0

あなたはこれをしようとしているという事実は、設計に問題があることを示します。私たちがお手伝いできるように、問題の文脈をもう少し提供してください! – Bas

+0

質問を編集しました。手伝って頂けますか? – Anu

+0

なぜあなたはデッドロックがあると思いますか?これにより、デッドロックは発生しません。 – CodingYoshi

答えて

1

にクラスから調達する必要がありますあなたが必要なコードだことを示しています

class A 
{ 
    B b; 
    public event EventHandler eventA; 

    void OnEventA() 
    { 
     var ea = this.eventA; 
     if (ea != null) 
     { 
      ea(this, new EventArgs()); 
     } 
    } 

    public A() 
    { 
     this.b = new B(this); 
     this.b.eventB += DoSomethingElse; 
    } 

    private void DoSomethingElse(object sender, EventArgs e) 
    { 
    } 
} 

class B 
{ 
    A a; 
    public B(A a) 
    { 
     this.a = a; 
     this.a.eventA += DoSomething; 
    } 
    public event EventHandler eventB; 

    void OnEventB() 
    { 
     var eb = this.eventB; 
     if (eb != null) 
     { 
      eb(this, new EventArgs()); 
     }  
    } 

    private void DoSomething(object sender, EventArgs e) 
    { 
    } 
} 
+0

あなたは私の一日を救った。私は完全にパラメータ化されたコンストラクタの概念を忘れてしまった。ありがとう、トン。 :) – Anu

1

あなたの問題を想定すると、あなたは右のインスタンスがそれぞれに話を取得しないということです

、タイプAのためにあなたのコンストラクタでタイプBのインスタンスを作成し、Athis)の現在のインスタンスへの参照を設定します。他には、ここであなたを助けるかもしれない一つのアプローチです。

public A() 
{ 
    // give B reference to A 
    b = new B(this); 
    // subscribe A to B's event 
    b.eventB += DoSomethingElse(); 
} 

あなたがタイプBのコンストラクタは、このようなAへの参照を受け入れている必要があります、これが動作するためには:

public B(A a) 
{ 
    // subscribe B to A's event 
    a.eventA += DoSomething(); 
} 

あなたはまた、から退会上に読むことをお勧めしますあなたがリソースを適切に解放するためのイベント。これらのリンクをチェックしてください:

What best practices for cleaning up event handler references?

Should I always disconnect event handlers in the Dispose method?

+0

私もあなたの答えをマークすることができたらいいと思う.. :) – Anu

関連する問題