2017-07-31 10 views
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を使用し、正しい行数を返しました。

答えて

0

ラムダ式が反復変数を取得するときの2番目の問題は、標準の問題です。

以下の点を変更してください。

for (int i = 0; i < linesToWrite; i++) 
{ 
    var t = i; 
    Task task = new Task(() => Logger.Info(logMsg + t)); 
    asyncTaskList.Add(task); 
    task.Start(); 
} 

GetLastLogLines()は何を表示できますか?

関連する問題