2016-06-14 8 views
7

Im сталкивается с общим вопросом, где я не могу найти хороший пример, чтобы попробовать это для себя. Google не помогает ни.Использование оператора с асинхронным вызовом | Отменить операцию?

Представьте структуру, как это:

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

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

    client.SendAsync(mail); 
} 

Что делать, если сервер работает медленно и занимает некоторое время, чтобы принять почту. Возможно ли, что SmtpClient расположен до операции? Будут ли они уничтожены или сломаны каким-либо образом?

Есть ли общий ответ для этого? Серверы здесь слишком быстры, не знаю, как сделать опрос.


Если думать об отмене BackgroundWorker его всегда заканчивая текущей операции. Может быть, то же самое здесь, или, может быть, не ...

+2

Да, этот код будет *** *** распоряжаться 'под клиента, прежде чем электронная почта отправляется. Это, вероятно, плохо. – spender

ответ

12

Вы можете использовать новую SendMailAsync метод, который возвращает Task и ждать этой задачи:

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

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

    await client.SendMailAsync(mail); 
} 

Это будет гарантировать, что клиент не является удаляется до SendMailAsync.

(конечно, это означает, что ваш метод теперь должен быть асинхронной, а)

+0

Согласно вашему последнему предложению, 'await' будет блокировать мой поток, не так ли? – C4u

+3

@ C4u no, 'await' будет * отпустить * поток, дождитесь завершения операции async, а затем возобновить выполнение. –

+0

@ AvnerShahar-Kashtan Ах ничего себе. Тогда у меня есть все, что я искал. Большое спасибо вам обоим :). – C4u

 Смежные вопросы

  • Нет связанных вопросов^_^