从两个线程写入txt文件

时间:2019-05-04 16:30:17

标签: c# streamwriter

我正在使用一个例程来捕获项目内部的任何异常。然后我将其写入文本文件中。但是,如果我尝试从两个不同的线程写入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文件已被使用。

1 个答案:

答案 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
        {

        }
    }
}