从两个线程写入一个txt文件

Write in a txt file from two threads

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

您需要像下面的代码一样同步您的 bloc。这里还有更多例子: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
        {

        }
    }
}