2017-11-26 8 views
1

私はActionBlockで以下のような小さなテストメソッドを持っています。トレース・メッセージを予期された順序で書き出しますが、完了することはありません。テストメソッドは決して終了しません。ActionBlockテストメソッドが完了しない

私はここで間違っていますか?あらかじめThx。

[TestMethod] 
public async Task ActionBlockTest() 
{ 
    var rnd = new Random(DateTime.Now.Millisecond); 
    var delay = new ActionBlock<int>(item => 
    { 
     var start = DateTime.Now; 
     Trace.WriteLine(string.Format("{0:ss fff} item start processing ({1})", start, item)); 

     return Task.Delay(item).ContinueWith(t => Trace.WriteLine(string.Format("{0:ss fff} item finished processing ({1}) took {2} ms", DateTime.Now, item, (DateTime.Now - start).TotalMilliseconds))); 
    }, new ExecutionDataflowBlockOptions 
    { 
     BoundedCapacity = 4, 
     MaxDegreeOfParallelism = 2 
    }); 

    for(int i = 0; i < 8; i++) 
    { 
     var d = rnd.Next(100, 1000); 
     Trace.WriteLine(string.Format("{0:ss fff} posting {1}", DateTime.Now, d)); 
     await delay.SendAsync(d); 
    } 

    await delay.Completion; 
} 

答えて

1

あなたが

delay.Complete(); 

は、これ以上のアイテムが到着するブロックを通知するために呼び出す必要があります。次に、現在のすべての作業(存在する場合)を処理した後、ブロックは完了状態になり、delay.Completionタスクが完了します。現時点ではawait delay.Completionは返されません。

+0

ニースキャッチ、ありがとう:) –

関連する問題