0
ログファイルに簡単に書き込むための静的ヘルパーメソッドが含まれている小さなロガークラスがあります。私はそれがどれほど頑丈であったかをテストしたかったので、一度に100回非同期に実行しようとしました。ファイルに非同期で書き込むと、不正な行数と不正な内容になります。
[TestMethod]
public void Diagnostics_AsyncWritePass()
{
int linesToWrite = 100;
String logMsg = "Async test log ";
List<Task> asyncTaskList = new List<Task>();
for (int i = 0; i < linesToWrite; i++)
{
Task task = new Task(() => Logger.Info(logMsg + i));
asyncTaskList.Add(task);
task.Start();
}
Task.WaitAll(asyncTaskList.ToArray());
List<String> lines = GetLastLogLines(linesToWrite);
foreach (String line in lines)
{
Assert.IsTrue(line.Contains(logMsg));
}
}
(Logger.Info
メソッド内)実際のロギングを使用して実行される。
File.AppendAllText(LogPath, logMsg + Environment.NewLine);
GetLastLogLines
方法がある:
private List<String> GetLastLogLines(int numLines)
{
List<String> lines = File.ReadLines(Logger.LogPath)
.Reverse()
.Take(numLines)
.ToList();
return lines;
}
しかし、私はこれには2つの問題を有しています。
- 最初はそれが100行を書いていないことである、第二は、すべての行が
Async test log 100
であることであるの周りに90 - 書いている - 数は、すべての行をインクリメントしません。私は、
i
カウンタが値渡しではなく参照渡しされていると推測しています。
なぜこれらの問題が発生する可能性がありますか?
EDIT: ラインの問題の間違った番号がGetLastLogLines
の内容を置き換えることで解決しました。以前はFile.ReadLines
を使用していましたが、LINQを使用してx行だけを取りました。代わりに、this answerを使用し、正しい行数を返しました。