1

Ich habe einen WebAPI-Webservice, der in einen Engpass gerät. Immer wenn viele Anfragen für einen lang laufenden Datenbankvorgang eingehen, dauern alle anderen Anfragen länger als normal.So überprüfen Sie, ob Task-Thread blockiert ist

der Webservice hat jedes Endpunktes wie folgt:

  var result = await Task.Run(() => 
      { 
       return _coordinator.GetValue(key); 
      }); 

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

wo _coordinator Klasse über Constructor injiziert wird, die einen Dienst (Nicht-Web-Service), die Daten aus der Datenbank holen wird (Langlauf nennen). _Coordinator kann mehrere lang andauernde Serviceaufrufe aufrufen, die wiederum von der Datenbank abrufen.

Aus meiner Sicht erstellt Task.Run eine Aufgabe, die in einem Thread aus dem Thread-Pool ausgeführt wird. Aber ich bin mir nicht sicher, ob diese Threads blockiert werden, wenn sie freigegeben werden können.

Also möchte ich den Thread den Koordinator-Code laufen lassen und sehen, ob es blockiert ist oder wenn es in den Thread-Pool freigegeben wird, bis der Maschinen-Service zurückkehrt.

+0

Threads sind eine ausreichende Ressource. Es ist sehr unwahrscheinlich, dass Sie auf die Anzahl der Threads beschränkt sind. Klingt wie Ihre Datenbank ist nur überlastet. Optimieren Sie die Abfrage. – usr

+0

Ist der _coordiantor_ eine dritte Partei oder ist es deine eigene? –

+0

_koordinator ist unsere eigene klasse. Es ist ein Durchreichen. Es ruft den Middleware-Service zum Abrufen von der Oracle-Datenbank auf. – abug

Antwort

2

Da GetValue() eine synchrone Methode ist, wird der von Task.Run() verwendete ThreadPool-Thread für die gesamte Zeit verwendet, die die Methode ausgeführt wird.

Wenn Sie sich Sorgen machen über die Anzahl der Threads, die Ihr Code verwendet (und da Sie sagen, dass Sie viele gleichzeitige Anfragen haben können, ist das eine berechtigte Sorge), dann sollten Sie GetValue() wirklich asynchron machen. Um dies zu tun, müssen Sie den Dienst asynchron aufrufen. Wie genau das gemacht wird, hängt davon ab, wie Sie den Service anrufen, aber in der Regel müssen Sie foo.Bar() in await foo.BarAsync() ändern.


Auch, weil Sie Ihren Code ein Webservice ist, ist es bereits auf einem Thread Threadpool ausgeführt wird, gibt es keinen Grund Task.Run() zu verwenden, um einen anderen Thread zu wechseln (und dann await verwenden die erste freizugeben).

Verwandte Themen