Es macht mehr Sinn, wo der Anruf mit wichtigen IO-Operationen stattfindet. Ja, Async ist schneller, da es den Anforderungsthread für die Zeit freigibt, in der die Operationen ausgeführt werden. Aus Sicht des Web-Servers geben Sie daher dem Pool einen Thread zurück, der vom Server für zukünftige Anrufe verwendet werden kann.
Also für z.B. Wenn Sie eine Suchoperation auf dem SQL-Server ausführen, möchten Sie möglicherweise async ausführen und den Leistungsvorteil sehen.
Es ist gut für die Skalierbarkeit, die mehrere Server beteiligt.
So z.B. Wenn das SearchRecordAsync sein SQL an die Datenbank sendet, gibt es eine unvollständige Aufgabe zurück, und wenn die Anfrage die Wartezeit erreicht, gibt sie das Anfragethread an den Thread-Pool zurück. Später, wenn die DB-Operation abgeschlossen ist, wird ein Anfrage-Thread aus dem Thread-Pool genommen und zum Fortsetzen der Anfrage verwendet.
Auch wenn Sie nicht verwenden, SQL-Operationen, lassen Sie sagen, dass Sie eine E-Mail zu 10 Personen senden möchten. In diesem Fall ist auch async sinnvoller.
Async ist auch sehr praktisch, um den Fortschritt eines langen Ereignisses anzuzeigen. So erhält der Benutzer immer noch die aktive GUI, während die Aufgabe im Hintergrund ausgeführt wird.
Um zu verstehen, sehen Sie sich bitte dieses Beispiel an.
Hier versuche ich eine Aufgabe namens Mail senden zu initiieren. Interim Ich möchte die Datenbank aktualisieren, während der Hintergrund Mail-Aufgabe senden ausführt.
Sobald die Datenbank-Update passiert ist, es für die Sende Mail-Aufgabe wartet abgeschlossen sein. Bei diesem Ansatz ist es jedoch klar, dass ich eine Aufgabe im Hintergrund ausführen und trotzdem mit dem ursprünglichen (Haupt-) Thread fortfahren kann.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Console.WriteLine("Starting Send Mail Async Task");
Task task = new Task(SendMessage);
task.Start();
Console.WriteLine("Update Database");
UpdateDatabase();
while (true)
{
// dummy wait for background send mail.
if (task.Status == TaskStatus.RanToCompletion)
{
break;
}
}
}
public static async void SendMessage()
{
// Calls to TaskOfTResult_MethodAsync
Task<bool> returnedTaskTResult = MailSenderAsync();
bool result = await returnedTaskTResult;
if (result)
{
UpdateDatabase();
}
Console.WriteLine("Mail Sent!");
}
private static void UpdateDatabase()
{
for (var i = 1; i < 1000; i++) ;
Console.WriteLine("Database Updated!");
}
private static async Task<bool> MailSenderAsync()
{
Console.WriteLine("Send Mail Start.");
for (var i = 1; i < 1000000000; i++) ;
return true;
}
}
Well Zunächst einmal vielen Dank für die Antwort. Du hast mir einige "Hausaufgaben" zu tun gegeben. Ich verstehe, dass Factory.StartNew schrecklich ist, da es bei jeder Anfrage tatsächlich einen neuen Thread einleitet! Ich verstehe auch, dass die "asynchrone Operation" bis zum Repository weitergeleitet werden muss, also bis GetUsers (Service) -> GetUsersAsync (Repository). Also werden wir eine Kette von asynchronen Methoden haben, bis hin zum Repository. Das Repository müsste ein Modell implementieren, das asynchrone Operationen unterstützt, z. B. Asynchronous Ado.Net oder EntityFramework. –
Wenn ich diese Web API erstellen würde, würde ich mit 3 Schichten beginnen: 1) Präsentation 2) Service und 3) Repository. Das Repository würde Async Ado.Net oder Entityframework implementieren. Darüber hinaus wird das alles auf dem Hauptthread jedoch mit ASYNCHRONOUS-Vorgängen geschehen. Ich habe versucht, die Theorie im folgenden Buch Multithreading in C# 5.0 Kochbuch "zu verschlingen". Es scheint, dass all dieses Wissen in meinem Kopf durcheinander ist, so Entschuldigungen, wenn Sie mich finden, Dinge zu wiederholen. Ich werde den Code veröffentlichen, der erklärt, was "ich denke" ich verstehe. Ich würde mich freuen, wenn Sie alle wieder so aktiv beitragen können !! –