我遇到了一个问题,我不确定这是不是我或是否存在线程锁定问题。
我有一个用于基本实用程序的类。在该类中是创建或附加文本文件的方法。因为我使用它调试,我有使用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中,其中线程更精细。
任何帮助都将不胜感激。
答案 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("-------------------------------");
}
}