Ich versuche, meinen Kopf async/warten und dachte, dass ich nur wenige Dinge über die Verwendung verstanden habe. Aber immer noch nicht ganz klar, was der eigentliche Vorteil in einem Szenario wie unten wäre.Welchen Unterschied macht es - Ausführen eines 'asynchronen' Aktionsdelegaten mit einer Task.Run (vs. Standard-Aktionsdelegate)?
Schauen Sie sich die Task.Run an. Die erste Methode verwendet einen normalen Delegaten und verwendet Thread.Sleep, aber der zweite verwendet 'asynchronen' Delegaten und Task.Delay.
Meine Frage ist: Wie macht dies einen Unterschied zu dieser Methode (oder es nicht)?
Die Methode selbst ist eine asynchrone Methode. Der Code erstellt einen separaten Thread (über Task.Run) und dieser Thread hat nichts anderes zu tun, als diesen Delegaten auszuführen. Also, selbst wenn es mit einer Wartezeit auf Task.Delay nachgibt, was ist die Verwendung in diesem Szenario, da der Thread sowieso ein isolierter Thread ist, der für nichts anderes verwendet wird und selbst wenn er nur Thread.Sleep verwendet, würde der Thread noch Kontext haben Wechseln Sie zu anderen Threads für den Prozessor.
// The task thread uses a async delegate
public async Task<bool> RetrySendEmail(MailMessage message)
{
bool emailSent = false;
await (Task.Run(***async()*** =>
{
for (int i = 0; i < 3; i++)
{
if (emailSent)
break;
else
// Wait for 5 secs before trying again
***await Task.Delay(5000);***
try
{
Smtphost.Send(message);
emailSent = true;
break;
}
catch (Exception e) { emailSent = false; // log; }
}
return emailSent;
}));
}
// The task thread uses a normal delegate
public async Task<bool> RetrySendEmail(MailMessage message)
{
bool emailSent = false;
await (Task.Run(***()*** =>
{
for (int i = 0; i < 3; i++)
{
if (emailSent)
break;
else
// Wait for 5 secs before trying again
***Thread.Sleep(5000);***
try
{
Smtphost.Send(message);
emailSent = true;
break;
}
catch (Exception e){ emailSent = false; // log; }
}
return emailSent;
}));
}
Vielen Dank, das ist hilfreich. Etwas abseits von Async, aber in diesem Beispiel habe ich einen neuen Thread erstellt (mit Task.Run, da 'Smtphost.Send' ein blockierender IO-Aufruf ist. Also dachte ich, es ist sinnvoll, das auf einen separaten Thread zu übertragen. Aber Sie denken, dass würde keinen Unterschied machen? –
@ EverythingMatters 'Task.Run' erstellt keinen Thread, es verwendet einen' ThreadPool'-Thread.Das können Sie tun, wenn Sie Arbeit in einen anderen Thread entladen möchten (das ist nützlich um beispielsweise den GUI-Thread zu entsperren), aber das verbessert die Performance nicht.Wenn der ursprüngliche Thread ein 'ThreadPool'-Thread ist, fügt das Blockieren eines anderen Threads keinen Wert hinzu. – i3arnon