C# 如何等待线程完成运行?thread.join使我的主线程没有响应?

C# 如何等待线程完成运行?thread.join使我的主线程没有响应?,c#,.net,C#,.net,我正在进行一个项目,该项目使用windows应用程序向多个用户发送邮件,但实际情况是,当我使用Thread.Join()方法时,它使我的主UI没有响应。。。。。。 我想要的是。。。。我想在单独的线程上运行SMTPClienTSetting()方法,并希望我的主UI对其他工作保持响应..我想在后台运行此邮件发送acvtivity…请建议我仅使用线程概念 public void SendMail(dataset ds) { for

我正在进行一个项目,该项目使用windows应用程序向多个用户发送邮件,但实际情况是,当我使用Thread.Join()方法时,它使我的主UI没有响应。。。。。。 我想要的是。。。。我想在单独的线程上运行SMTPClienTSetting()方法,并希望我的主UI对其他工作保持响应..我想在后台运行此邮件发送acvtivity…请建议我仅使用线程概念

public void SendMail(dataset ds)
        {
                           for(inti=0<ds.Tables[0].Rows.Count<i++)
                            {

                                Thread tMail = new Thread(() => {
                                     resValue = SMTPClienTSetting(ds, mail);

                                });
                                tMail.IsBackground = true;
                                tMail.Start();
                                tMail.Join();
                                if (resValue == "True")
                                {
                                   Thread tPopUp = new Thread(new ThreadStart(this.ShowMessagePopUp));
                                   tPopUp.IsBackground = true;
                                  this.BeginInvoke((MethodInvoker)delegate{
                            });
                                   tPopUp.Start();
                                   lblPOpUpInfo = "Message sent successfully to \nAsset Owner : " + AssetOwner + "\n" + "Email : " + RecipientID;

                                }
                                else
                                {
                                     Thread tPopUp = new Thread(new ThreadStart(this.ShowMessagePopUp));
                                     tPopUp.IsBackground = true;
                                                                 this.BeginInvoke((MethodInvoker)delegate{
                            });
                                     tPopUp.Start();
                                     lblPOpUpInfo = "Message sending failed to \nAsset Owner :" + AssetOwner + "\n" + "Email : " + RecipientID + "!!!\nPlease check your SMTP details and\nInternet Connection..!!!";
                                }
                         }
        }
        #region Function for setting SMTP Client
                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 = base64Decode(ds.Tables[0].Rows[0][1].ToString());

                        NetAccess.Password = genFunc.base64Decode(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;
                    }
                }
                #endregion
        }

    #region Function to show Pop Up window using separate thread
    public void ShowMessagePopUp()
    {
           try
            {
                frmHomePopUp homePopUp = new frmHomePopUp();
                mailTimer.Elapsed += delegate { mailTimer.Stop(); homePopUp.Close(); };
                //mailTimer.Elapsed += this.TimeEvent;
                mailTimer.Interval=5000;
                mailTimer.Enabled = true;
                homePopUp.lblInfo.Text = lblPOpUpInfo;
                homePopUp.Refresh();
                mailTimer.Start();
                homePopUp.ShowDialog();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

    }
    #endregion

    public  void mailTimer_Elapsed(object source, EventArgs e)
    {
        //frmHome home;
        mailTimer.Stop();
      }
public void SendMail(数据集ds)
{

对于(inti=0基本上:不要使用
Thread.Join
;它的作用是阻塞

适当的方法是在worker方法末尾执行任何UI工作:

Invoke
/
BeginInvoke
的调用切换回UI线程,基本上起回调的作用


请注意,您可能还希望在此处使用
线程池
而不是
线程

基本上:不要使用
线程。加入
;这样做的目的是阻止

适当的方法是在worker方法末尾执行任何UI工作:

Invoke
/
BeginInvoke
的调用切换回UI线程,基本上起回调的作用


请注意,您可能还想在这里使用
线程池,而不是
线程。

您使用的是哪个版本的C#?Wait==什么都不做==没有响应。Don't Wait。您使用的是哪个版本的C#?Wait==什么都不做==没有响应。Don't Wait。嗨,Mark,这个。BeginInvoke解决了我的问题。但是我ant做一些小的修改。请建议我怎么做。如果(resValue==True),我需要执行更多操作,请建议我如何操作。请查看我编辑的代码…..嗨,Mark,当我获得resValue时,我想在新窗口中显示lblPopUpInfo.Text 5秒,然后关闭它,然后再次打开它以显示下一条消息。我想像ASP.NET中的弹出窗口一样进行操作。因此,这个打开和关闭问题发生了Ining…@Vishalpatil确实存在同样的问题;您不必通过
线程“等待”。Sleep(5000)
。你需要让UI线程快速完成。相反,创建一个持续时间为5秒的
计时器,当计时器启动时:关闭表单。嗨,马克,根据你的指导,我使用了计时器等待5秒,5秒后我需要关闭表单…如何操作???我使用了thread.abort()…这正在生成名为thread的mssage正在中止…我想在mailTimer_Appead()方法中关闭我的表单,请帮助我…查看我编辑的代码…如果可能,请添加您的代码…@VishalIPatil
homePopUp.close()
?嗨,马克,这个.BeginInvoke解决了我的问题。但是我想做一些轻微的修改。请建议我怎么做。如果(resValue==True),我需要执行更多操作,请建议我如何操作。请查看我编辑的代码…..嗨,Mark,当我获得resValue时,我想在新窗口中显示lblPopUpInfo.Text 5秒,然后关闭它,然后再次打开它以显示下一条消息。我想像ASP.NET中的弹出窗口一样进行操作。因此,这个打开和关闭问题发生了Ining…@Vishalpatil确实存在同样的问题;您不必通过
线程“等待”。Sleep(5000)
。你需要让UI线程快速完成。相反,创建一个持续时间为5秒的
计时器,当计时器启动时:关闭表单。嗨,马克,根据你的指导,我使用了计时器等待5秒,5秒后我需要关闭表单…如何操作???我使用了thread.abort()…这正在生成名为thread的mssage正在中止…我想在mailTimer_appead()方法中关闭我的表单,请帮助我…查看我编辑的代码…如果可能,请添加您的代码…@VishalIPatil
homePopUp.close();
Thread tMail = new Thread(() => {
     resValue = SMTPClienTSetting(ds, mail);

     if (resValue == "True") {
        // blah blah blah
     }
     // now: if you need to update any UI state:
     this.BeginInvoke((MethodInvoker)delegate {
        someControl.Text = lblPOpUpInfo; // for example
     });
});
tMail.IsBackground = true;
tMail.Start();