2017-07-10 65 views
0

A类有一个事件。 B类想要订阅它。 B类有一个事件,A类想要订阅它。c#类订阅彼此的事件

我试着在A中创建类B的对象,并在B中创建类A的对象,但这是一个死锁。

我需要帮助这里...

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