我使用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);
}
答案 0 :(得分:2)
您的代码是线程安全的
但这与static
方法没什么关系,而是与方法的作用有关
您的Log
方法仅根据MSDN调用本身是线程安全的Console.WriteLine
。
简而言之:制作方法static
并不能使其自动保证线程安全
但是:.NET Framework中的大多数static
方法都是线程安全的。
答案 1 :(得分:1)
你的问题基本上是,无论是否
Console.WriteLine("")
是否是线程安全的? 答案在这里:Calling Console.WriteLine from multiple threads(是)
但是,这可能会导致一些竞争条件。 另一件事,你可以得到多个 Directory.Delete()
如果你的事件会迅速发生,会引发许多例外情况。