0

の使用に関連していると思われる、再現が難しい問題に直面していますCancellationToken。次の図に示すように、ASP.NET Web API を介して通信する 3 つの非同期アプリ (それぞれが異なるサーバー上) があります。

A ---> B ---> C

appは、 Aapp への多数の同時要求を起動するルーチンを時々実行します。Bこれにより、 app への別の多数の同時要求が起動されますC。これらの呼び出しはすべて を使用して行われ、次のようHttpClient.SendAsyncに を使用して 10 秒のタイムアウトに制限されますCancellationToken

var cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(10));
var token = cancellationTokenSource.Token;

サーバーCの負荷が高いと、応答に時間がかかり始めB、タイムアウトが構成されているため、サーバーは要求のキャンセルを開始します。これが発生すると、リクエストが「スタック」することがあります(下の画像を参照)。

ここに画像の説明を入力

私は C# 非同期のベスト プラクティスに精通しており、そのようなことはしていませ.Result.Wait()。これらがハングを引き起こす可能性があることを認識しています。

代わりにパスCancellationToken.Noneすると問題は解決するので、ヒントは、並行性の高いシナリオでのキャンセルに関係しているということです。

時間が経つにつれて、ますます多くの要求がハングし始め、最終的には IIS をリセットしてそれらをなくすしかありません。

何が起こっているのかの手がかりはありますか?

4

1 に答える 1