2012-04-19 54 views
1

下面的代碼是常見的:爲什麼必須有一個委託來橋接線程及其方法?

Work w = new Work(); 
w.Data = 42; 
threadDelegate = new ThreadStart(w.DoMoreWork); 
newThread = new Thread(threadDelegate); 
newThread.Start(); 

我只是奇怪,爲什麼必須是委託給線程,並在該線程上執行方法?

我們可以直接將方法名稱發送給線程嗎?

回答

5

我們可以直接發送方法名稱給線程嗎?

作爲一個字符串? EWWW。如果不是字符串,你會如何建議告訴線程要執行什麼?代表是在.NET中表示「用特定簽名執行某些事情」的方式慣用的

請注意,您不需要使用new ThreadStart或使用單獨的變量。這種方法使用組轉換工作得很好:

newThread = new Thread(w.DoMoreWork); 
newThread.Start(); 

或者,如果你並不需要所有這些變量:

new Thread(new Work { Data = 42 }.DoWork).Start(); 

編輯:請注意,由於.NET 4,這是一般一個更好的主意使用Task Parallel Library這種事情。

+0

@SteveTownsend:確實是這樣。將添加到答案,如果考慮到這是一個好主意:) – 2012-04-19 14:47:35

+2

順便說一句喬恩那也沒關係,有沒有管理委託和C函數指針超出了類似的使用之間的關係(例如啓動一個線程)?我知道委託人最有可能擁有一個內部的方法列表,因爲它有'+ ='操作符,但這裏還有什麼可以說的嗎? – Tudor 2012-04-19 15:23:39

2

委託表示數據類型,就像Integer或Double代表它們各自的數據類型一樣。代表定義了一個由它們的簽名(返回類型和參數)標識的函數類。就像Integer方法參數指定需要一個Integer值,委託指定具有特定簽名的方法是預期的。您需要指定預期的函數類型,原因與使用基本數據類型的原因相同。當你傳入你的函數時,它會傳遞一個指向你想調用的函數或者對象方法的指針,也就是在那個函數被定義的地方。如果你只是以一個字符串的形式傳入一個函數名,它就不知道這個名字的函數在哪裏;除非你以某種方式定義了包含要調用的函數定義的類。

詳情參見下面的各位代表:

Info on C# delegates from Microsoft

stackoverflow question - why-do-we-need-c-sharp-delegates

以下鏈接是使用反射在Java調用由同名的方法的例子。正如你所看到的,你需要指定哪個類包含你想要調用的方法。委託的實際參數是直接指向方法的指針,這就是簽名必須匹配的原因。

Java reflection

相關問題