簡體   English   中英

在C#Windows應用程序中使用輔助線程打開新的彈出窗口不起作用?

[英]In C# Windows application using secondary thread to open new popup window not working?

在My C#windows應用程序中,我構建了一個自動郵件系統,通過SMTP設置告知用戶他們在應用程序中設置的關鍵事件......這個郵件系統工作正常。 我使用System.Net.Mail命名空間來實現這個....

我的問題是,無論何時成功發送郵件,我都需要在一個窗體上顯示一個顯示Recepient名稱及其電子郵件ID的通知窗口(彈出窗口)。

為此目的,我正在使用輔助線程,但它無法正常工作,它使我的主應用程序無響應,直到它向所有用戶發送郵件。 對於每個郵件已經給出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;
            }
        }

我能夠使用線程顯示我的表單,但主要應用程序沒有響應,直到它完成發送郵件....

您可以使用TPL進行異步郵件發送,使用ContinueWith進行與UI線程的交互。 這樣的事情

for (int i = 0; i < 10; i++)
{
    var asyncTask = Task.Factory.StartNew(() => SendMail(i)).ContinueWith((result) =>
    {
        // UI interaction logic
    });
}
private bool SendMail(string data)
{
    // send logic
    // you can handle result from this function in ContinueWith delegate function
}

我覺得這里不需要新線程。 另外,請避免使用DoEvents,請參閱此處或自行搜索。 您是否考慮將一個小型列表框作為某種控制台/日志並在那里顯示成功或失敗消息? 每個用戶都討厭一直拋出消息框的應用程序。

您的阻止代碼實際上包含在SMTPClienTSetting方法中,在您的情況下,該方法在主線程(UI線程)上執行。 為了避免UI阻塞,您應該在不同的線程上執行此方法(您可以使用Vadim建議的方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM