我正在使用一个例程来捕获项目内部的任何异常。然后我将其写入文本文件中。但是,如果我尝试从两个不同的线程写入txt文件,该如何防止异常?
public static void LogFile(string ex)
{
try
{
string strPath = @"C:\Log.txt";
if (!File.Exists(strPath))
File.Create(strPath).Dispose();
using (StreamWriter sw = File.AppendText(strPath))
{
// sw.WriteLine("=============Error Logging ===========");
sw.WriteLine("===========Start============= " + DateTime.Now);
sw.WriteLine("Error Message: " + ex);
//sw.WriteLine("Stack Trace: " + ex.StackTrace);
sw.WriteLine("===========End============= " + DateTime.Now);
sw.WriteLine();
}
}
catch
{
}
}
当两个线程试图同时写入我的LogFile.txet时,我得到了一个例外,即* txt文件已被使用。
答案 0 :(得分:2)
例如,您需要像下面的代码那样使您的集团同步。这里有更多示例:C# version of java's synchronized keyword?
附带说明,有些事情(例如忽略异常)不被认为是好的做法。您可能还考虑使用日志记录库,该库可以处理多线程,性能等问题。
static object Lock = new object();
public static void LogFile(string ex)
{
lock (Lock) {
try
{
string strPath = @"C:\Log.txt";
if (!File.Exists(strPath))
File.Create(strPath).Dispose();
using (StreamWriter sw = File.AppendText(strPath))
{
// sw.WriteLine("=============Error Logging ===========");
sw.WriteLine("===========Start============= " + DateTime.Now);
sw.WriteLine("Error Message: " + ex);
//sw.WriteLine("Stack Trace: " + ex.StackTrace);
sw.WriteLine("===========End============= " + DateTime.Now);
sw.WriteLine();
}
}
catch
{
}
}
}