同僚が留守中に書いたコードをデバッグしようとしています。
呼び出しは次のとおりです。
var sw = Stopwatch.StartNew();
logger.Trace("Time A: {0}ms", sw.ElapsedMilliseconds); // Roughly 0ms
pt.Task = ProcessMetricsWorker(pt.CancelTokenSource);
sw.Stop();
logger.Trace("Time B: {0}ms", sw.ElapsedMilliseconds); // Over 20000ms!
メソッドのシグネチャは次のとおりです。
async Task ProcessMetricsWorker(CancellationTokenSource cancelTokenSource)
このメソッドの実行には約 20 秒かかります。ログによると、上記の最初の行の直前と直後に配置すると、そのasync
部分が無視されているかのように、タスクが同期的に実行されています。これが起こる原因は何ですか?
await
async メソッド内に呼び出しがあることに注意してください。それが違いを生むとは想像できませんが、それはwhileループの中にあります。
// internal to the method referenced above
result = await metricProcessor.ProcessItem(domain);
また、非常に単純な async/await セットアップを実行する小さなテスト アプリを作成して、実行しているサーバーで await が実際に動作することを確認し、メインではなく、小さなテスト ケースで正しく動作することを確認しました。デバッグしようとしているアプリ。