2009-01-21 37 views
4

我需要什麼代表和線程?C#代表和線程!

+0

功課?這是一個非常基本的問題 – johnc 2009-01-21 23:13:11

+4

即使它可能是基本的,它仍然是一個合法的問題。 – 2009-01-21 23:48:56

回答

11

代表充當邏輯(但安全),相當於函數指針;他們允許您以抽象的方式談論操作。這個典型的例子是事件,但我會用更多的「函數編程」的例子:在列表中搜索:

List<Person> people = ... 
Person fred = people.Find(x => x.Name == "Fred"); 
Console.WriteLine(fred.Id); 

的「拉姆達」在這裏本質上是一種委託的實例 - 一個委託類型Predicate<Person> - 即「給予一個人,是真實的還是錯誤的」。使用代表允許非常靈活的代碼 - 即List<T>.Find方法可以根據呼叫者通過的委託來找到各種事情。

以這種方式,它們在很大程度上的作用類似於1方法接口 - 但更爲簡潔。

2

代表用於動態地向事件添加方法。

線程在進程內運行,並允許您一次運行共享資源的2個或更多任務。

+0

代表們做的比這多很多...... – 2009-01-21 23:15:48

7

Delegates:基本上,委託是引用方法的一種方法。它就像一個指向方法的指針,您可以將它設置爲與其簽名匹配的不同方法,並使用它將引用傳遞給該方法。

Thread是一個接一個地執行完成計算的指令序列流。您可以同時運行不同的線程來完成特定的任務。線程在單個邏輯處理器上運行。

1

具體的例子總是幫助我,所以這裏是一個線程。考慮你的網絡服務器。當請求到達服務器時,它們被髮送到Web服務器進程進行處理。它可能會處理每個到達,完全處理請求和生成頁面之前,轉向下一個。但是請考慮在硬盤驅動器速度(而不是CPU速度)下進行多少處理,因爲在完成響應之前請求的頁面從磁盤中提取(或從數據庫中提取數據)。

通過從線程池中提取線程併爲每個請求提供自己的線程,我們可以在磁盤返回第一個數據之前處理數百個請求的非磁盤需求。這將允許一定程度的虛擬並行性,可以顯着提高性能。請記住,Web Server的性能還有很多,但這應該給你一個關於線程如何有用的具體模型。

0

你的問題是含糊不清......

但你可能只是想知道如何使用它們,以便有一個窗口,一個耗時的過程運行和進度條...

因此,創建一個線程來完成耗時的過程,並使用委託來增加進度條! :)

1

它們用於高級語言有用的相同原因。你不需要他們做任何事情,因爲他們真的只是對真正發生的事情的抽象。他們的確讓事情變得更容易,更快速地編程或理解。

1

Marc Gravell爲'代表什麼是代表'提供了一個很好的答案。

安德魯·特羅爾森定義了一個線程作爲

...的過程中的執行路徑。 「Pro C#2008和.NET 3.5平臺」,Aress。

在您的系統上運行的所有進程都至少有一個線程。我們稱之爲主線程。您可以根據各種原因創建其他線程,但是說明線程目的的最明顯的例子是打印。假設你打開你最喜歡的文字處理應用程序(WPA),輸入幾行,然後打印這些行。如果您的WPA使用主線程來打印文檔,WPA的用戶界面將被「凍結」,直到打印完成。這是因爲主線程必須打印的線條,纔可以處理任何用戶界面事件,即按鈕點擊,鼠標移動等,這是因爲如果代碼是這樣寫的:

do 
    { 
     ProcessUserInterfaceEvents(); 
     PrintDocument(); 
    } while (true); 

顯然,這不是用戶想要的。用戶希望用戶界面在文檔正在打印時具有響應性。

答案當然是在第二個線程中打印行。通過這種方式,用戶界面可以專注於處理用戶界面事件,而輔助線程專注於打印線條。

錯覺是兩項任務同時發生。在單處理器機器上,這不可能是真實的,因爲處理器一次只能執行一個線程。但是,線程之間的切換髮生得如此之快以至於通常會保持錯覺。在多處理器(或多核)機器上,這可能是字面上真實的,因爲主線程可以在一個處理器上運行,而輔助線程在另一個處理器上運行。

在.NET中,線程是一件輕而易舉的事情。您可以使用System.Threading.ThreadPool類,使用異步委託或創建自己的System.Threading.Thread對象。

如果你是新來的線程,我會拋出兩個警告。

首先,如果您選擇錯誤的線程模型,實際上可能會損害應用程序的性能。要小心避免使用太多的線程或試圖線索那些應該真正發生的事情。

二(更重要的),要知道,如果你線程之間共享數據,你可能會需要sychronize訪問共享數據,例如,使用C#lock關鍵字。有豐富的關於這一主題在網上提供的信息,所以我就不在這裏重複了。要知道,你可以遇到間歇性的,並不-總是重複的錯誤,如果你不這樣做仔細。