※ ChatGPTを利用し、要約された質問です(原文:C# バックグランドのキャンセル方法???)
C#バックグランドのキャンセル方法
このQ&Aのポイント
SMTPでメール送信中にバックグラウンド処理をキャンセルする方法について
バックグラウンドの処理中に定期的にキャンセルをチェックし、キャンセルされた場合には処理を中断する
バックグラウンド処理がキャンセルされた場合にはメッセージを表示する
SMTP でメールを送る際に 4000KB 以上ある画像ファイルを添付しております
当然時間が掛かりますので送信部分を切り出してバックグランド化致しました
主要部分は次の通りです
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
smtp.Host = "smtp.MyMail.com";
string MailSubject = "";
string MailBody = "";
MailMessage oMsg = new MailMessage("○○○@○○○.com", "□□□@□□□.com", MailSubject, MailBody);
oMsg.Attachments.Add(new Attachment(@"大きな画像.bmp"));
smtp.Send(oMsg);
でもやはり送信には時間が掛かりますのでキャンセル機能を追加いたいと思い、その方法を調べました
するとバックグランドの中の重たい処理の途中で定期的にキャンセルの有無をチェックしろとあり、サンプルとして下の例が示されています
このForループの中に処理を入れろと言われても送信部分は一本道です、ループの中に組込みようがありません、どうすれば良いのでしょうか?
★ それとも私は基本的な誤解をしているのでしょうか???
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
//処理中にキャンセルされていないかを定期的にチェックする
if (this.backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
}
}
//バックグラウンド処理の終了を判断する
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("キャンセルされました");
}
else
{
MessageBox.Show("キャンセルされずに終了しました");
}
}
お礼
ご回答ありがとうございます ご指導の通り SendAsync と SendAsyncCanc を使いましたら一発OKでした ありがとうございました、今後も宜しくご指導願います