Доступ к статическому методу из статического класса из разных потоков.Это безопасно? - PullRequest
0 голосов
/ 21 июня 2011

У меня есть мониторинг папки с помощью FileSystemWatcher, чтобы удалить из нее указанные файлы. Когда возникает событие FileSystemWatcher, я создаю новый поток для удаления файла. Мой поток кода безопасен? Я не уверен насчет статического метода Log, который доступен из Threads.

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 ]

2 голосов
/ 21 июня 2011

Ваш код является потокобезопасным.
Но это не имеет ничего общего с static методами, а с тем, что делают методы.
Ваш Log метод вызывает только Console.WriteLine, который сам по себе является потокобезопасным в соответствии с MSDN.

Вкратце: создание метода static не делает его автоматически безопасным для потоков.
Но: Большинство static методов в .NET Framework реализованы в поточно-ориентированном режиме.

1 голос
/ 21 июня 2011

Ваш вопрос в основном,

Console.WriteLine("")

потокобезопасен или нет? Ответ здесь: Вызов Console.WriteLine из нескольких потоков (ДА)

Однако это может привести к некоторым условиям гонки. Другое дело, вы можете получить несколько

   Directory.Delete()

звонки на случай, если ваше событие будет запущено быстро, вызывая много исключений.

...