2009-10-28 58 views
2

如果非gui对象构造函数将一个本地事件处理方法连接到另一个线程上某个对象的事件字段,是否可以在构造函数完成之前调用该事件处理方法?在构造函数中线程化C#事件

实施例:(只有语义伪代码)

public static B b = new B(); 

class A 
{ 
    public A() 
    { 
     b.evt += EventHandler(); 

     Thread.Sleep(5000); 
    } 

    protected void EventHandler() 
    { 
     // Some stuff 
    } 
} 

class B 
{ 
    public event evt; 

    public void ThreadedLoop() 
    { 
     while (true) 
     { 
      RaiseEvt(); 
     } 
    } 
} 

回答

1

是的,因为事件处理方法被称为在另一线程的上下文中。

在你的例子中,事件处理程序是类A的一个方法,但是当它被调用时,它在由类B表示的线程的上下文中被调用。当执行类A的构造函数的线程休眠时,由B类开始工作,提升事件并在过程中调用事件处理程序。

+0

Ta。我想我主要担心的是,我不能完全确定对象是否真的存在,直到构造函数完成。 – Nicholas

+0

我知道别人可以比我更好地解释它,但它与A是否存在没有任何关系。你已经注册了一个System.Delegate类型的对象。代表存在,这就是关键。不过,根据你的评论,我用Visual Studio中的一个快速示例进行了仔细检查,并且按照我所描述的那样工作。 –

1

有一点要记住,整个对象不在另一个线程上。如果该对象的某个例程在另一个线程中执行,则该对象直接进行的任何调用都将在同一个线程上执行。这包括委托调用。

因此,你的对象不存在于某个特定的线程中,而是由它执行的例程执行。当有人从另一个线程调用其中一个例程时,该例程将在另一个线程上执行。这很重要,因为您拥有的类级别数据并不属于特定的一个线程。如果您不处理调用发生在另一个线程中的事实,则可能会导致并发问题并导致对象的类级别数据损坏。

+0

任何人都在意解释为什么我的答案是downvoted? – jasonh