Technisch gesehen, die funktioniert, aber es funktioniert durch einen neuen Thread Schaffung eines synchronen Operation auszuführen, die selbst wickelt und die Blockierung auf einem in sich asynchronen Betrieb. Das bedeutet, dass Sie nicht die größten Vorteile bekommen, überhaupt zu gehen.
Der richtige Weg ist, asynchron den ganzen Weg zu gehen. Während jetzt haben Sie wahrscheinlich so etwas wie folgt aus:
private class UserService
{
public IdentityUser GetById(int id)
{
return mContext.Users.Single(u => u.Id == id);
}
}
... Sie sollten nun einen Asynchron-Version erstellen:
private class UserService
{
public async Task<IdentityUser> GetByIdAsync(int id)
{
return await mContext.Users.SingleAsync(u => u.Id == id);
}
}
Verbrauch:
public async Task<IdentityUser> GetByIdAsync(int id)
{
return await _userService.GetByIdAsync(id);
}
Gesetzt, natürlich, dass Ihr zugrundeliegendes Framework unterstützt asynchrone Methoden wie SingleAsync()
für inhärent asynchrone Operationen. Dadurch kann das System den aktuellen Thread freigeben, während Sie auf die Datenbanken warten e Operation zum Abschluss. Der Thread kann an anderer Stelle wiederverwendet werden, und wenn die Operation abgeschlossen ist, können Sie den Thread verwenden, der zu diesem Zeitpunkt gerade verfügbar ist.
Es ist wahrscheinlich auch lesenswert über und Annahme these Best Practices. Wahrscheinlich möchten Sie .ConfigureAwait(false)
überall dort verwenden, wo Sie nicht auf Kontextinformationen wie Sitzungen und Anfragen zugreifen.
Diese Antwort setzt natürlich voraus, dass GetById
von Natur aus asynchron ist: Sie rufen es von einer Festplatte oder einem Netzwerkstandort oder etwas ab. Wenn Sie die ID des Benutzers mit einer lang andauernden CPU-Operation berechnen, ist Task.Run()
ein guter Weg zu gehen, und Sie werden wahrscheinlich zusätzlich angeben wollen, dass es eine langwierige Aufgabe in den Argumenten Task.Run()
ist.
Lange laufende Abfragen haben eine lange Liste möglicher Probleme, mit denen Sie umgehen müssen. Warum nicht einfach das SignalR nugget installieren und alles für dich reparieren lassen - und auch den Websocket-Support! –
@ MattiasÅslund: Unterschiedliche Leute haben unterschiedliche Definitionen von "long-running". Ich habe das Gefühl, GetById() ist nicht die Art von "long-running", die SignalR nutzen würde. – StriplingWarrior
Ist es etwas, das Sie als WCF-Dienst oder als Web-API verwenden? Wenn das der Fall ist, verschärfen Sie nur die Server-Seite. – Noseratio