2016-06-14 96 views
7

我面臨一個普遍的問題,我無法找到一個很好的例子來爲我自己嘗試。谷歌也不是一個幫助。使用語句和異步調用|幹操作?

想像這樣的結構:

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

是的,這個代碼*** ***將處置'client'之前發送的電子郵件。這可能是不好的。 – 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否,'await'將釋放線程,等待異步操作完成,然後恢復執行。 –

+0

@ AvnerShahar-Kashtan啊哇。然後我有我想要的一切。非常感謝你們兩位:)。 – C4u