锁(obj)可能无法正常工作c#

时间:2017-06-20 20:15:01

标签: c# multithreading locking

我遇到了一个问题,我不确定这是不是我或是否存在线程锁定问题。

我有一个用于基本实用程序的类。在该类中是创建或附加文本文件的方法。因为我使用它调试,我有使用lock()来保持访问单一的方法。除此之外,它似乎失败并允许多个线程进入被阻止的代码。

运行我的测试线程时,每次都不会抛出错误。这有点奇怪。创建了50个线程/任务。每个线程都使用下面的类将一行写入单个文件。它循环执行大约3100个单独的任务。但是,最多可以创建50个任务来处理每个批次。当每个线程完成其任务时,将创建一个新任务以取代它。最后一批处理了3188个命令,并抛出了16个错误。

我尝试过使用Monitor.Enter和Exit,但我得到了相同的结果。我也尝试过只读StdLibLockObj。都具有相同的结果。

错误:进程无法访问文件'ThreadExe.txt',因为它正由另一个进程使用。

   static class StdLib
   {
      private static object StdLibLockObj = new object();
      public static void WriteLogFile(string @AFileName, string FileData, bool AppendIfExists = true, bool AddAppPath = true)
      {
         lock (StdLibLockObj)
         {
            StreamWriter sw = null;
            try
            {
               if (AddAppPath)
               {
                  AFileName = @Path.Combine(@ApplicationPath(), @AFileName);
               }

               if ((AppendIfExists) && File.Exists(AFileName))
               {
                  sw = File.AppendText(AFileName);
               }
               else
               {
                  sw = File.CreateText(AFileName);
               }
               sw.Write(FileData);
            }
            finally
            {
               if (sw != null)
               {
                  sw.Flush();
                  sw.Close();
                  sw.Dispose();
               }
               sw = null;
            }
         }
      }
  }

我的背景主要是在Delphi中,其中线程更精细。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

将StreamWriter条目包装在“使用”块中。这将摆脱锁定。有点像这样:

    public static void ErrorMessage(string logMessage)
    {
        using (StreamWriter sw_errors = new StreamWriter(m_errors, true))  
        {

            sw_errors.Write("\r\nLog Entry : ");
            sw_errors.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
                DateTime.Now.ToLongDateString());
            sw_errors.WriteLine("  :");
            sw_errors.WriteLine("  :{0}", logMessage);
            sw_errors.WriteLine("-------------------------------");

        }
    }