2016-09-19 92 views
2

Supose我有幾個線程和委託運行的方法。多線程和委託調用

public delegate void Del(string threadId, string value, ref string result); 

public event Del Analyze= null; // The external world can plug in a method 


// this method runs simultanioulsy in several threads 
private void threaded() 
{ 
    string s= null; 
    // yadayada s gets a value and I want a result back 
    // from the external world 
    string result = null; 

    is (Analyze != null) 
     Analyze("some thread id", s, ref result); 
} 

我知道,作爲事件的方法必須按順序同步線程安全的,等等,但會發生什麼,如果

Analyze("some thread id", s, ref result); 

被稱爲在同一時間?這可以嗎?或者我需要同步分析,如:

lock(someobj) 
{ 
    Analyze("some thread id", s, ref result); 
} 

所以,問題更像是:是一個「事件」這樣的線程的視圖調用類的點(我知道我必須保證線程安全安全在方法的插入式)

+0

是的,在使用多線程共享的資源時,您應該始終進行同步。 –

+0

@ rory.ap這肯定取決於「Analyze(...)'是否修改狀態? –

+0

@ScottPerham我希望它能做到,否則在參數'ref'中沒有意義。 – itsme86

回答

2

引發事件可以這樣做的同時多線程的,如果這是你想要的行爲的類。 「事件」就像按順序調用的方法列表。

每一個單獨的線程將被提高一個單獨的事件,正如你說這是事件處理程序的責任來應對被稱爲由獨立的事件多線程的可能性,如果這是該事件是如何設計的。從視類引發事件的點

線程安全是不是你所要求的,因爲你是混合方面一個很好的說明。線程的安全性是關於一個類是否可以在多線程情況下被安全地調用,以確保這些線程不會通過類的狀態進行交互。