2009-10-28 18 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