Sto cercando di mettere la testa in asincrono/aspettare e ho pensato di capire alcune cose sull'utilizzo. Ma ancora non abbastanza chiaro quale sarebbe il vantaggio effettivo in uno scenario come di seguito.Che differenza fa - eseguire un'azione delegata "asincrona" con un Task.Run (vs delegato azione predefinito)?
Esaminare l'attività. Utilizzo. Il primo metodo utilizza un delegato normale e utilizza Thread.Sleep ma il secondo utilizza delegato 'async' e Task.Delay.
La mia domanda è: in che modo questo fa alcuna differenza con questo metodo (o non lo fa)?
Il metodo stesso è un metodo asincrono. Il codice sta creando un thread separato (tramite Task.Run) e questo thread non ha nient'altro da fare se non eseguire quel delegato. Quindi, anche se produce un attese su Task.Delay, qual è l'utilizzo in questo scenario, poiché il thread è comunque un thread isolato non utilizzato per nient'altro e anche se utilizza solo Thread.Sleep, il thread sarebbe comunque in contesto passare a produrre altri thread per il processore.
// 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;
}));
}
Grazie, è utile. Un po 'fuori strada da async ma in questo esempio, ho creato una nuova discussione (con Task.Run poiché "Smtphost.Send" è una chiamata di I/O bloccata.) Quindi, è logico scaricarla su una thread separata. pensi che questo non faccia alcuna differenza? –
@EverythingMatters 'Task.Run' non crea un thread, usa un thread' ThreadPool'. Puoi farlo se vuoi scaricare il lavoro su un thread diverso (questo è utile per esempio per sbloccare il thread della GUI) ma ciò non migliora le prestazioni Se il thread originale è un thread 'ThreadPool', il blocco di un altro thread non aggiunge alcun valore. – i3arnon