当前位置:编程学习 > C#/ASP.NET >>

线程操作的问题(不解)

我现在做的是一个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()  设置一个变量也不行, --------------------编程问答-------------------- --------------------编程问答-------------------- 望高手解决,谢谢,在线等, --------------------编程问答-------------------- 自己顶下,高手快点出现啊 --------------------编程问答--------------------
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("发送成功");
        }
--------------------编程问答-------------------- 楼上的朋友,我一开始也没有用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() //用线程去控制发送到接口
{
  //发送到接口的代码........
}

但是这样也卡住,不行啊,所以想用异步调用的方式,网上说可以解决卡住的情况,可事实上没有解决,是不是我用的不对还是? --------------------编程问答-------------------- 我原本是先弹出发送成功的框,然后再执行后台线程,但是这样的话,客户一看已经成功了,就关掉软件了,这样的话,线程根本就没执行或者没有执行结束,就退出程序了,所以我是想解决这个问题 --------------------编程问答-------------------- 你上面的调用没看出什么问题。除非是你没贴出来的代码出问题了 --------------------编程问答-------------------- 不是有问题,是我先弹出窗口,然后让线程后台运行,但是用户一看到已经发送成功的话,就关闭软件了,这个线程根本就没有执行,或者没有执行结束 --------------------编程问答-------------------- 或者如何操作线程,才不会让其卡死,另外BackgroundWorker这个是异步执行的么? --------------------编程问答-------------------- BackgroundWorker 与 Threading均为异步 --------------------编程问答-------------------- 先弹出窗口,然后让线程后台运行,但是用户一看到已经发送成功的话,就关闭软件了,这个线程根本就没有执行,或者没有执行结束   这个问题如何解决
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,