2016-06-14 12 views
7

私は試してみると良い例が見つからないという一般的な質問に直面しています。 Googleは役に立たない。非同期呼び出しでの文の使用| Cancle操作ですか?

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

あなたはTaskを返す新しいSendMailAsyncメソッドを使用して、そのタスクを待つことができません。

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

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

    await client.SendMailAsync(mail); 
} 

これは、クライアントがないことを確認しますSendMailAsyncが完了する前に処分されます。

(もちろん、これはあなたの方法は、今だけでなくasyncを指定するために有することを意味する)

+0

あなたの最後の文章によると、 'await'はスレッドをブロックするでしょうか? – C4u

+3

@ C4uいいえ、 'await'はスレッドを解放し、非同期操作が完了するのを待ってから実行を再開します。 –

+0

@ AvnerShahar-Kashtanああ。それから私は私が探していたすべてを持っています。両方のあなたに大きなおかげで:)。 – C4u

関連する問題