我刚刚更新到xUnit 2.1。 我通过大量测试运行这种方法,这些测试与不同的程序集并行运行,以使用特定名称登录到同一文件。 问题是我无法管理并发(即使使用TextWriter.Synchronized),每次运行我的测试时,不同的测试说:
错误是:
Message: System.IO.IOException : The process cannot access the file 'C:\LOGS\myFileName-20170510.txt' because it is being used by another process.
我的方法是:
private static void WriteToLogFile(string fileName, string strMessage)
{
DateTime utcNow = DateTime.UtcNow;
lock (fileName)
{
using (StreamWriter w = File.AppendText(fileName + utcNow.Year + utcNow.Month.ToString("00") + utcNow.Day.ToString("00") + ".txt"))
{
w.WriteLine("{0};{1};{2}", DateTime.UtcNow, SecurityHelper.GetPrincipalName(), strMessage);
w.Flush();
w.Close();
}
}
}
我甚至尝试过(但这没有帮助):
private static void WriteToLogFile(string fileName, string strMessage)
{
DateTime utcNow = DateTime.UtcNow;
lock (fileName)
{
using (StreamWriter w = File.AppendText(fileName + utcNow.Year + utcNow.Month.ToString("00") + utcNow.Day.ToString("00") + ".txt"))
{
w.WriteLine("{0};{1};{2}", DateTime.UtcNow, SecurityHelper.GetPrincipalName(), strMessage);
w.Flush();
w.Close();
}
}
}
private static readonly ConcurrentDictionary<string, object> Tokens = new ConcurrentDictionary<string, object>();
private static object GetToken(string fileName)
{
if (!Tokens.ContainsKey(fileName))
Tokens.TryAdd(fileName, new object());
return Tokens[fileName];
}
这是由于xUnit的一些奇怪行为? 提前谢谢。
答案 0 :(得分:0)
以下行是一个问题:
data
不要将字符串和参数用作锁定对象。在您的情况下尝试私有静态对象。请参阅MSDN和this question on stackoverflow。这看起来像这样:
lock (fileName)
这解决了多个线程想要一次写入的潜在问题,但这不是真正的问题。看看这个stackoverflow question。我并不完全知道xunit测试运行器是如何工作的,但是如果有多个进程一次写入,那么你将获得该异常。而不是使用private readonly object Locker = new object();
private static void WriteToLogFile(string fileName, string strMessage)
{
DateTime utcNow = DateTime.UtcNow;
lock (Locker)
{
...
使用它(如stackoverflow问题的答案所示):
File.AppendText
操作系统将允许多个进程访问同一文件。
您可能仍然遇到以下问题:内容可能很混乱,因为例如两个进程可能想要在同一行写入然后连续转储两个换行符。作为一种变通方法,您可以将进程ID附加到日志文件中。
如果这太奇怪了,可以考虑使用一个记录库来管理这类问题。