C# 尽管锁定了块,但在写入文本文件时发生IOException
我知道答案肯定在某个地方,我应用了许多其他问题和MSDN本身的建议,但我可能忽略了一些东西 这是我的方法,我使用它将输出转储到文件。为清晰起见,附上锁定对象声明C# 尽管锁定了块,但在写入文本文件时发生IOException,c#,locking,ioexception,streamwriter,appendtext,C#,Locking,Ioexception,Streamwriter,Appendtext,我知道答案肯定在某个地方,我应用了许多其他问题和MSDN本身的建议,但我可能忽略了一些东西 这是我的方法,我使用它将输出转储到文件。为清晰起见,附上锁定对象声明 private static Object fileLock = new Object(); private static void WriteToFile(string msg, bool WriteLine) { lock (fileLock) { msg = DateTime.Now.ToShort
private static Object fileLock = new Object();
private static void WriteToFile(string msg, bool WriteLine)
{
lock (fileLock)
{
msg = DateTime.Now.ToShortTimeString() + " - " + msg;
FileInfo F = new FileInfo("dump.txt");
using (StreamWriter writer = F.Exists ? F.AppendText() : F.CreateText()) //<--THIS LINE THROWS
{
if (WriteLine)
writer.WriteLine(msg);
else
writer.Write(msg);
}
}
}
再一次,我确信这是一个微不足道的问题,有人问了这样的问题,得到了正确的答案,但我无法把它挖掘出来
更新
重构
FileInfo
对象并切换到File.XXX
方法使代码工作正常。我仍然想知道问题是什么,不管怎么说,问题看起来已经解决了。@Guffa:declaration必须是私有静态对象fileLock=newobject()
@亚历克斯:你的代码在我的机器上运行得很好,虽然对任务来说有点太复杂了
static void Write(string text, string file)
{
using (StreamWriter sw = File.AppendText(file))// Creates or opens and appends
{
sw.WriteLine(text);
}
}
可能某些防病毒或索引器会锁定转储文件。当您从静态方法访问实例成员(
fileLock
)时,该文件不会编译。锁标识符的声明实际上是什么样子的?您正在运行应用程序的两个实例吗?@Guffa fileLock确实是静态的,该行不像代码的其余部分那样被复制粘贴。编辑以修复调试期间仅运行一个实例的问题。我的下一个问题是,为什么不在日志记录期间保持打开文件?还有哪些方法(如果有的话)可以访问dump.txt
?你是从外部看的吗?因为重构FileInfo对象似乎已经解决了这个问题(不知道为什么,但仍然如此),所以这一点被接受。谢谢
static void Write(string text, string file)
{
using (StreamWriter sw = File.AppendText(file))// Creates or opens and appends
{
sw.WriteLine(text);
}
}