虽然这可能是一个非常着名的问题,但是在所有实现锁定之后我得到了这个例外,而另一个需要。但我有时会得到例外,但无法弄清楚发生了什么。
我正在做的是,在我的应用程序中,我以这种方式将一些日志消息写入文本文件。
WriteToFile(DateTime.Now +“Method1():已输入”,LOG_FILE_NAME);
WriteToFile的定义是这样的:
public void WriteToFile(string message,string fileName)
{
try
{
lock (filelock)
{
using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
// Create the writer for data.
using (BinaryWriter w = new BinaryWriter(fs))
{
// Write data to Test.data.
w.Write(System.Environment.NewLine);
w.Write(message);
w.Write(System.Environment.NewLine);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
}
每当这个异常到来时,它都会向调用者抛出异常,我再次写入该文件。就像这样:
public void Method1()
{
try
{
WriteToFile(DateTime.Now + "Method1(): Entered", LOG_FILE_NAME);
}
catch(Exception ex)
{
WriteToFile(DateTime.Now + "Exception in Method1():"+ex.Message, LOG_FILE_NAME);
}
}
但是现在在Method1()中,捕获的异常能够写入文件。
所以,我在这里寻求任何人的帮助。还有其他更好的方式在这里做日志记录吗?
谢谢& Regads
帕德玛
答案 0 :(得分:1)
如果这是您的“真实世界”问题(日志记录),您应该使用经过良好测试,工作且可扩展的解决方案进行日志记录 - > microsoft enterprise lib或log4net。否则请添加更多/所有有关您尝试的内容的详细信息。
答案 1 :(得分:0)
MSDN says“我的功能为您提供了比锁定和解锁更高的文件I / O操作效率和性能”。
这意味着您可以使用my.Computer.FileSystem.WriteAllText()代替。我个人会创建一个streamwriter对象:
public void WriteToFile(string message, string fileName)
{
System.IO.StreamWriter fstream;
fstream = new System.IO.StreamWriter(fileName,true);
// stream writer adds newline to the end for you
fstream.WriteLine(message);
// flush to send all buffered data to the file
fstream.Flush();
// close the file, free resources
fstream.Close();
}
另外我相信你需要在写入文件后解锁文件,否则它可能会保持锁定状态。第三,您是否有锁定日志文件的具体原因?就像你在同一时间从多个进程写入它一样?如果没有,那么我不明白为什么你需要先把它锁起来。
答案 2 :(得分:0)
您正在寻找这样的东西吗? :)
public void WriteToFile(string message,string fileName)
{
try
{
StreamWriter w = File.AppendText(filename)
w.WriteLine(message);
w.Close();
}
catch (Exception ex)
{
throw ex;
}
}