2012-08-17 28 views
2

僞代碼:C#事件:哪個線程

class A 
{ 
    Dictionary<string, object> dic = new Dictionary<string, object>(); 
    public Do() 
    { 
     some_a.SomeEvent += (s, e) => 
       { 
        dic["some_string"] = new object(); 
       }; 
     dic["some_other_string"] = new object(); 
    } 
} 

這安全嗎?這將是如果兩個字典操作都在同一個線程上。他們呢?

編輯在我的情況下,事件被觸發在與Do相同的線程,所以它是安全的。

+0

好吧,它取決於你的「some_a」對象調用SomeEvent處理程序的線程。如果是的話,假設它是安全的,否則,不。 – 2012-08-17 10:38:34

+0

您可以使用類似於 的東西來檢測您正在運行哪個線程Console.Write(System.Threading.Thread.CurrentThread.ManagedThreadId); – AlSki 2012-08-17 10:41:00

回答

4

的事件發生(通常),該調用事件的線程上。所以我們不能實際評論,因爲你沒有顯示導致事件被調用的代碼!

嚴格地說,該事件可能在任何線程 - 要麼是因爲隨機線程調用OnSomeEvent(或任何觸發),或者如果OnSomeEvent實現選擇使用BeginInvoke出於某種原因,但這種可能性不大。

最終歸結爲:是否有理由認爲此代碼中涉及多個線程。

不過:什麼絕對並非如此:沒有,沒有什麼會使該事件,訂閱它的線程上自動發生。事件訂閱只是一個對象+方法對;訂閱中不提供任何線索。

1

除非您專門在不同的線程中啓動事件處理程序,否則這兩個操作確實會在同一個線程上運行(假設單個線程應用程序)。

3

事件處理程序中的代碼將在引發事件的線程上執行。

class AsyncWorker 
{ 
    public void BeginWork() 
    { 
     new TaskFactory().StartNew(() => RaiseMyEvent()); 
    } 

    public event EventHandler MyEvent; 

    private void RaiseMyEvent() 
    { 
     var myEvent = MyEvent; 
     if(myEvent != null) 
      myEvent(EventArgs.Empty); 
    } 
} 

var worker = new AsyncWorker(); 
worker.MyEvent += (s, e) => 
        { 
         /* I will be executed on the thread 
         started by the TaskFactory */ 
        }; 
worker.BeginWork();