我现在做的是一个WINFORM 工具是VS2005,是短信发送的项目,现在在一个form中有个按钮button1,是发送按钮
private void button1_Click(object sender, EventArgs e)
{
  psend(smstel,smscontent);
}public void psend(string smstel,string smscontent)    //发送前判断;
{
.................//前面处理的代码省略System.Threading.Thread t1 = new Thread(new ThreadStart(this.UserInvoke));
t1.IsBackground = true;
t1.Start();////////////////////////线程开始后,我想判断线程结束后,弹出一个窗口发送成功,我该如何判断
//MessageBox.Show("发送成功");
}private void UserInvoke()//异步调用
{
   MethodInvoker mi = new MethodInvoker(xcfs);
   this.BeginInvoke(mi);
   Thread.Sleep(300);
} private void xcfs()  //用线程去控制发送到接口
{
  //发送到接口的代码........
}我现在的困惑是:
1、我如果把弹出窗口放在线程执行前弹出,再执行线程,这样的话有个问题,就是万一用户看到已经发送成功了,马上把软件关闭了,这样线程没执行完或者根本就没执行就退出程序了,
2、如果放在线程开始后,再弹出,这样线程可能没有全部运行完,就马上弹出了,我该如何判断线程是否运行结束,我在xcfs()  设置一个变量也不行,

解决方案 »

  1.   

    private void xcfs() //用线程去控制发送到接口
    {
      //发送到接口的代码........  //函数退出前填出提示
      MessageBox.Show("Finished");
    }另外这个invoke其实并不合理private void UserInvoke()//异步调用
    {
      MethodInvoker mi = new MethodInvoker(xcfs);
      this.BeginInvoke(mi);
      Thread.Sleep(300);
    }  因为invoke其实是委托主线程去执行xcfs函数。xcfs耗时长的话,可能导致界面卡主,违背你用后台线程发送的初衷了。可以把发送代码直接放在UserInvoke中:private void UserInvoke()//异步调用
    {
      //发送到接口的代码........  //函数退出前填出提示
      MessageBox.Show("Finished");
    } 另外也可以用BackgroundWorker实现        public void psend2(string smstel, string smscontent) //发送前判断;
            {
                //前面处理的代码省略
                BackgroundWorker work = new BackgroundWorker();
                work.RunWorkerCompleted += new RunWorkerCompletedEventHandler(work_RunWorkerCompleted);
                work.DoWork +=new DoWorkEventHandler(work_DoWork);
                work.RunWorkerAsync();
            }        void work_DoWork(object sender, DoWorkEventArgs e)
            {
                UserInvoke();
            }        void work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show("发送成功");
            }
      

  2.   

    楼上的朋友,我一开始也没有用this.BeginInvoke(mi);
    但是还是卡住啊,所以我用那个,但是也卡住,
    一开始我是这样的,
    private void button1_Click(object sender, EventArgs e)
    {
      psend(smstel,smscontent);
    }public void psend(string smstel,string smscontent) //发送前判断;
    {
    .................//前面处理的代码省略System.Threading.Thread t1 = new Thread(new ThreadStart(xcfs));
    t1.IsBackground = true;
    t1.Start();////////////////////////线程开始后,我想判断线程结束后,弹出一个窗口发送成功,我该如何判断
    //MessageBox.Show("发送成功");
    }
    private void xcfs() //用线程去控制发送到接口
    {
      //发送到接口的代码........
    }但是这样也卡住,不行啊,所以想用异步调用的方式,网上说可以解决卡住的情况,可事实上没有解决,是不是我用的不对还是?
      

  3.   

    或者如何操作线程,才不会让其卡死,另外BackgroundWorker这个是异步执行的么?
      

  4.   

    BackgroundWorker 与 Threading均为异步