2011-06-21 5 views
0

FileSystemWatcherを使用してフォルダを監視して、そこから指定されたファイルを削除しました。 FileSystemWatcherイベントが発生すると、新しいスレッドを作成してファイルを削除します。コードスレッドは安全ですか? スレッドからアクセスされる静的Logメソッドについてはわかりません。静的メソッドを静的クラスから別のスレッドにアクセスします。それは安全ですか?

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メソッドは、MSDNに従ってスレッドセーフであるConsole.WriteLineのみを呼び出します。

簡潔に:メソッドstaticを作成してもスレッドセーフではありません。
ただし、.NET Frameworkのほとんどのstaticメソッドはスレッドセーフで実装されています。

1

あなたの質問は

Console.WriteLine("") 

は、スレッドセーフであるか否か、基本的にはありますか? 答えはここにあります:Calling Console.WriteLine from multiple threads(はい)

しかし、いくつかの競合条件が発生する可能性があります。 もう一つは、あなたのイベントは、多くの例外を引き起こし、急速に発火する場合は、複数の

Directory.Delete() 

呼び出しを得ることができます。

+0

固有のフォルダはDirectory.Delete()メソッドに渡されるため、ここでは問題は発生しません。 – Tomas

+0

入れ子のフォルダはどうですか?複数のFileWatchers?だからこそ "あなたは**得ることができた**"です。 – DiVan

+0

それは正しいですが、自分の状況ではサブフォルダのない最上位のフォルダしか持っていないと説明していません。一般的にあなたは正しいです! – Tomas