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.
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
Ist der _coordiantor_ eine dritte Partei oder ist es deine eigene? –
_koordinator ist unsere eigene klasse. Es ist ein Durchreichen. Es ruft den Middleware-Service zum Abrufen von der Oracle-Datenbank auf. – abug