2016-06-14 23 views
7

Sto affrontando una domanda generale in cui non riesco a trovare un buon esempio per provare da solo. Google non è un aiuto neanche.Utilizzo di istruzioni con chiamata asincrona | Cancella operazione?

immaginare una struttura come questa:

MailMessage mail = new MailMessage(sender, receiver); 
using(SmtpClient client = new SmtpClient()) 
{ 
    client.Host ... 
    client.Port ... 

    mail.subject ... 
    mail.body ... 

    client.SendAsync(mail); 
} 

Che cosa succede se il server è lento e richiede un po 'per accettare la posta. È possibile che lo SmtpClient sia eliminato prima che l'operazione venga eseguita? Sarà cerchiato o rotto in qualche modo?

C'è una risposta generale per questo? I server qui sono troppo veloci, non so come fare una prova.


Se pensando a cancellazione di una BackgroundWorker sua finitura sempre l'operazione in corso. Potrebbe essere lo stesso qui, o forse no ...

+2

Sì, questo codice sarà *** *** disporre del 'Client' prima che l'e-mail viene inviata. Questo è probabilmente cattivo. – spender

risposta

12

È possibile utilizzare il metodo più recente SendMailAsync che restituisce un Task, e attendere che il compito:

MailMessage mail = new MailMessage(sender, receiver); 
using(SmtpClient client = new SmtpClient()) 
{ 
    client.Host ... 
    client.Port ... 

    mail.subject ... 
    mail.body ... 

    await client.SendMailAsync(mail); 
} 

Questo farà sì che il cliente non è smaltito prima del SendMailAsync.

(naturalmente, questo significa che il vostro metodo di ora deve essere asincrona pure)

+0

Secondo l'ultima frase, 'await' bloccherà la mia discussione, giusto? – C4u

+3

@ C4u no, 'await' * rilascia * il thread, attende l'operazione asincrona da completare, quindi riprende l'esecuzione. –

+0

@ AvnerShahar-Kashtan Ah wow. Poi ho tutto quello che stavo cercando. Grazie mille a tutti e due :) – C4u