2011-06-21 65 views
0

我使用FileSystemWatcher監視文件夾以從中刪除指定的文件。當FileSystemWatcher事件引發時,我創建了新的線程來刪除文件。我的代碼線程安全嗎? 我不確定從線程訪問的靜態日誌方法。從不同線程的靜態類訪問靜態方法。它安全嗎?

FileSystemWatcher.EventRaised.... 
{ 
    var delFolder = Path.GetDirectoryName(e.FullPath); 
    var t = new Thread(DeleteThread.Do); 
    t.Start(delFolder); 
} 
/*..code skip...*/ 



static class DeleteThread 
     { 

      public static void Do(object delFolder) 
      { 
       try 
       { 
        Log("Deleting folder {0}", (string)delFolder); 
        Directory.Delete((string)delFolder, true); 
       } 
       catch (Exception e) 
       { 
        Log("Error deleting folder {0}. {1}", (string)delFolder, e.Message); 
       } 
      } 
     } 

     private static void Log(string text, string text1 = "", string text2 = "", string text3 = "") 
     { 
      Console.WriteLine(text, text1, text2, text3); 
     } 

回答

2

您的代碼是線程安全的。
但是這與static方法沒有多大關係,只是用了什麼方法。
您的Log方法只能調用Console.WriteLine,它本身是根據MSDN線程安全的。

簡而言之:制定方法static不會使其自動安全。
但是:.NET Framework中的大多數static方法都是線程安全的。

1

你的問題基本上是,

Console.WriteLine("") 

是否是線程安全與否? 答案在這裏:Calling Console.WriteLine from multiple threads(YES)

但是,它可能會導致您一些競爭條件。 另一件事,你可以得到多個

Directory.Delete() 

通話的情況下,您的活動會迅速開火,造成許多例外。

+0

唯一的文件夾將被傳遞給Directory.Delete()方法,所以我在這裏沒有看到任何問題。 – Tomas

+0

嵌套文件夾怎麼樣?多個FileWatchers?這就是爲什麼它「你**可以**」。 – DiVan

+0

這是對的,但我沒有解釋,在我的情況下,我只有頂級文件夾沒有子文件夾。一般而言,你是對的! – Tomas