Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从两个线程写入txt文件_C#_Streamwriter - Fatal编程技术网

C# 从两个线程写入txt文件

C# 从两个线程写入txt文件,c#,streamwriter,C#,Streamwriter,我正在使用例程捕获项目中的任何异常。然后我把它写在一个文本文件中。但是,如果我试图从两个不同的线程写入txt文件,如何防止出现异常 public static void LogFile(string ex) { try { string strPath = @"C:\Log.txt"; if (!File.Exists(strPath)) File.Create(strPath

我正在使用例程捕获项目中的任何异常。然后我把它写在一个文本文件中。但是,如果我试图从两个不同的线程写入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同步,例如,如下面的代码。这里有更多的例子:

另一方面,有些事情不被认为是好的实践,比如忽略异常。您也可以考虑使用一个日志库,它可以关注多线程、性能和……

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
        {

        }
    }
}

将日志文件方法中的代码封装到一个?您需要使用锁定机制来提供对线程之间共享资源的独占访问。哦!谢谢你的快速回复!只要两个简单的问题,我会把它标记为答案!第一个问题,我是否需要将静态字段设置为只读?示例静态只读对象锁=新对象;第二个问题,如果我想读取我的文件,使用ReaderWriterLock还是Interlocked而不是lock更好?还是有相同的结果您不必将字段设置为只读。可以认为,标记不打算修改lock对象的意图是必要的。首先,您必须澄清如何读取文件。如果它将由另一个进程完成,那么读卡器就不关心编写器如何执行其内部锁定。如果您想使用相同的过程,那么执行文件I/o可能会非常慢。我看不出在您的案例中使用比简单锁更复杂的东西有什么好处。联锁和读写器锁定旨在提高简单锁定的性能,但仅适用于特定场景。