2015-10-29 40 views
0

我正在使用FileSystemWatcher類,並注意到創建事件的事件處理程序在單獨的線程上運行。我想了解多線程編程,並且有一種印象,那就是您獲得的唯一線程是主線程。事件處理程序似乎創建新線程

我認爲,當你想擁有另一個線程時,你需要明確地創建它。我很困惑爲什麼eventhandler方法中的代碼在不同於主線程的線程中運行。

class Program 
{ 
    static void Main(string[] args) 
    { 
     FileSystemWatcher w = new FileSystemWatcher(@"c:\test\");  
     w.Created += new FileSystemEventHandler(OnCreated); 
     w.EnableRaisingEvents = true; 
     Console.ReadLine(); 
    } 


    private static void OnCreated(object source, FileSystemEventArgs e) 
    { 
     // Specify what is done when a file is changed, created, or deleted. 
     Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType + " " + Thread.CurrentThread.ManagedThreadId); 
    } 
} 

我希望有人能爲我澄清這一點。謝謝

+0

「FileSystemWatcher類」...那是哪種語言? –

+0

我的意思是System.IO.FileSystemWatcher在C# – user3378547

+0

請找到編輯你的問題的按鈕,然後!有些人只對他們感興趣的語言進行過濾,所以他們甚至不會看到你的問題。例如,由於多線程標誌,我碰巧碰到它,但我現在幾乎沒有任何關於C#(或Java,因爲JimN猜測)。 –

回答

0

你被誤解了。它是而不是,系統中唯一的線程是您明確創建的線程。您可以使用其他API或庫(包括Java附帶的「核心」庫),並且這些庫可以自由創建他們需要的任何線程,以實現和提供他們宣傳的服務。在很多情況下,除了創建自己的線程之外別無他法。

一些例子:

  1. 您正在使用的文件守望者服務。有些東西需要與操作系統進行交互,並檢測文件系統中的某些內容是否發生了變化。監控和回調與您的主線程異步(也就是說,並行且不受時序限制)。
  2. 擺動(GUI)。這必須在另一個線程上運行,以便UI可以工作(並保持響應),即使在其他線程(如主線程)正在做其他事情時也是如此。
  3. 垃圾回收器線程在後臺運行,並定期回收內存以供重用。

編輯:

  1. 檢查文檔:

    要你如何知道什麼時候一個API將使用自己的線程回調的問題作出迴應。對於高質量的apis,如核心 apis,通常記錄這類事情。

  2. 作爲一般的經驗法則,您可以假設任何製作回調的api都會使用自己的線程來執行此操作(這通常並非總是如此)。
  3. 試着學習(或預測或猜測)圖書館如何在內部工作。文件再一次是一個開始的好地方。如果你知道它有自己的線程,並且如果它進行回調,那麼很可能這些回調將在這些線程上發生。
  4. 使用一些常識。 api不能使用你的(主要或其他)線程爲你做回調,除非你首先調用api。而且爲了在一段時間內工作,api需要在這段時間內壟斷你的線程,這意味着你將無法將線程用於其他任何事情。
+0

我明白了,你如何認識這樣的代碼塊?我現在必須使用線程安全隊列來收集這些事件。但事先知道這一點很好。這是否有一些通用規則? – user3378547

+0

問題是關於C#,而不是Java。也就是說,*大多數*無論如何都適用,爲了清晰起見,請考慮調整差異。 – Servy

+0

是的,如果我有C#的經驗,我可能會這樣做。抱歉! – JimN