1

WebAPI Webサービスがボトルネックに陥っている。長時間実行されているデータベース操作が1回発生するという要求が多くなると、タスクスレッドがブロックされているかどうかをチェックする方法

次のようにWebサービスは、各エンドポイントを有する:

_coordinatorは、データベースからデータをフェッチするサービス(非Webサービス)(長時間実行を呼び出すコンストラクタを介して注入されたクラスである
  var result = await Task.Run(() => 
      { 
       return _coordinator.GetValue(key); 
      }); 

      return Request.CreateResponse(HttpStatusCode.OK, result); 

)。 _coordinatorは、データベースからフェッチするいくつかの長期実行サービス呼び出しを呼び出すことがあります。

私の理解から、Task.Runは、スレッドプールからスレッドで実行されるタスクを作成します。しかし、それらのスレッドが解放されたときにブロックされているかどうかはわかりません。

コーディネータコードを実行しているスレッドを取得し、ブロックされているか、マシンサービスが返るまでスレッドプールに解放されているかどうかを確認したいと思います。

+0

スレッドは十分なリソースです。あなたがスレッドの数に制限されていることはほとんどありません。あなたのデータベースのような音は、単に過負荷になります。クエリを最適化します。 – usr

+0

'_coordiantor'はサードパーティーですか、それともあなたのものですか? –

+0

_coordinatorは私たち自身のクラスです。パススルーです。 Oracle DBからフェッチするためにMiddleware Serviceを呼び出します。 – abug

答えて

2

GetValue()は同期メソッドなので、Task.Run()で使用されるThreadPoolスレッドは、メソッドが実行されている間ずっと使用されます。

あなたのコードで使用するスレッドの数が心配な場合は、GetValue()を真に非同期にする必要があります。これを行うには、サービスを非同期で呼び出す必要があります。どのようにするかは、サービスの呼び出し方法によって異なりますが、通常foo.Bar()await foo.BarAsync()に変更する必要があります。あなたのコードはWebサービスであることから、それはすでにThreadPoolのスレッドで実行されている


また、別のスレッドに切り替えて(その後、最初のものを解放するためにawaitを使用)するTask.Run()を使用する理由はありません。

関連する問題