从不同线程的静态类访问静态方法。安全吗?

时间:2011-06-21 08:10:17

标签: .net class static thread-safety

我使用FileSystemWatcher监视文件夹以从中删除指定的文件。当引发FileSystemWatcher事件时,我创建新线程来删除文件。我的代码线程安全吗? 我不确定从Threads访问的静态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 个答案:

答案 0 :(得分:2)

您的代码是线程安全的 但这与static方法没什么关系,而是与方法的作用有关 您的Log方法仅根据MSDN调用本身是线程安全的Console.WriteLine

简而言之:制作方法static并不能使其自动保证线程安全 但是:.NET Framework中的大多数static方法都是线程安全的。

答案 1 :(得分:1)

你的问题基本上是,无论是否

Console.WriteLine("")

是否是线程安全的? 答案在这里:Calling Console.WriteLine from multiple threads(是)

但是,这可能会导致一些竞争条件。 另一件事,你可以得到多个

   Directory.Delete()
如果你的事件会迅速发生,会引发许多例外情况。