私のC#Windowsアプリケーションでは、SMTP設定を使用してアプリケーションで設定した主要なイベントについてユーザーに通知する自動メールシステムを1つ構築しました...このメールシステムは正常に動作しています。これを実現するために System.Net.Mail 名前空間を使用しました....
私の問題は、メールが正常に送信されるたびに、受信者の名前とその電子メール ID を 1 つの Windows フォームに表示する通知ウィンドウ (ポップアップ ウィンドウ) を表示する必要があることです。
この目的のために、私はセカンダリ スレッドを使用していますが、正しく動作していません。すべてのユーザーにメールを配信するまで、メイン アプリケーションが応答しなくなります。メールごとに 5 秒のスレッド スリープが与えられているため、メールが 10 件あると考えてください。その後、メイン アプリケーションを 50 秒間使用できなくなります。
私は次のような C# コーディングを行いました。
//My main Function
public void SendMail(dataset ds)
{
for(inti=0;i<ds.Tables[0].Rows.Count;i++)
{
string resValue = genFunc.SMTPClienTSetting(ds, mail);
if (resValue == "True")
{
Thread tPopUp = new Thread(new ThreadStart(this.ShowMessagePopUp));
tPopUp.IsBackground = true;
tPopUp.Start();
lblPOpUpInfo = "Message sent successfully";
}
else
{
Thread tPopUp = new Thread(new ThreadStart(this.ShowMessagePopUp));
tPopUp.IsBackground = true;
tPopUp.Start();
lblPOpUpInfo = "Message sending failed";
}
}
}
//Thread Function to open secondary form
public void ShowMessagePopUp()
{
try
{
frmHomePopUp homePopUp = new frmHomePopUp();
homePopUp.Show();
homePopUp.lblInfo.Text = lblPOpUpInfo;
Application.DoEvents();
Thread.Sleep(5000);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public string SMTPClienTSetting(DataSet ds, MailMessage MailstoSend)
{
try
{
SmtpClient objsmtp = new SmtpClient();
NetworkCredential NetAccess = new NetworkCredential();
NetAccess.UserName = ds.Tables[0].Rows[0][0].ToString();
NetAccess.Password = ds.Tables[0].Rows[0][1].ToString();
objsmtp.Credentials = NetAccess;
objsmtp.Host = ds.Tables[0].Rows[0][2].ToString();
objsmtp.Port = Convert.ToInt16(ds.Tables[0].Rows[0][3].ToString());
objsmtp.Send(MailstoSend);
System.Threading.Thread.Sleep(500);
return "True";
}
catch (NullReferenceException nr)
{
return nr.Message;
}
catch (Exception ex)
{
return ex.Message;
}
}
スレッドを使用してフォームを表示できますが、メールの送信が完了するまでメインアプリケーションが応答しません....