我在应用程序中使用C#,并且在文件被锁定时遇到一些问题。
这段代码就是这样做的,
while (true)
{
Read a packet from a socket (with data in it to add to the file)
Open a file // one of these randomly throws an exception saying that the file is locked
Writes data to it
Close a file
}
但在此过程中文件被锁定。我真的不明白,我们是如何肯定地捕获和报告异常,所以我不知道文件每次都不会被关闭。
我最好的猜测是其他东西正在打开文件。它不太可能是另一个应用程序,但它可能是一个不同的线程,但我只是想证明它的方式。有人可以提供一段代码来检查文件是否打开,如果是,请报告processId和threadId文件是否打开。
例如,如果我有这段代码,
StreamWriter streamWriter1 = new StreamWriter(@"c:\logs\test.txt");
streamWriter1.WriteLine("Test");
// code to check for locks??
StreamWriter streamWriter2 = new StreamWriter(@"c:\logs\test.txt");
streamWriter1.Close();
streamWriter2.Close();
这将引发异常,因为当我们第二次尝试打开文件时文件被锁定。那么评论是什么,我可以在那里报告当前应用程序(进程ID)和当前线程(线程ID)文件被锁定?
感谢。
答案 0 :(得分:2)
这不会直接回答您的问题,但Sysinternals和Process Explorer等免费Process Monitor工具对此类调试非常有用。
答案 1 :(得分:1)
这是一些将跨线程保护资源的伪代码:
while (true)
{
Read a packet from a socket (with data in it to add to the file)
lock (static locker object)
{
Open a file
Writes data to it
Close a file
}
}
在C#世界中,静态锁定器对象通常在类级别声明:
private static readonly object locker = new object();
如果文件的打开和关闭之间的语句抛出异常,我还建议使用using
关键字来保护文件资源。重做伪代码:
while (true)
{
Read a packet from a socket (with data in it to add to the file)
lock (static locker object)
{
using (Open a file)
{
Writes data to it
} // leaving the using block will close the file
}
}