我现在做的是一个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 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() 设置一个变量也不行,
解决方案 »
- 如何在vs2010中创建WPF Browser Application项目
- 能按项目文件夹结构自动生成NameSpace?
- 如何表中的一个字段存的数据是'30','38','41'如何把30,38,41从这个字段里摘出来存入ArrayList里
- 用动态生成的TreevViee导航动态改变GridView中显示的数据,为什么一点TreeView的节点GridView就不见了?
- 集思广益 广纳贤贴!!!
- 郁闷!!
- DataGrid的输入数据的问题
- 》》》》》》》》》》做windows服务遇到的问题,困扰了我一个多星期了啊
- 关于datetime的一个问题
- DataGrid中显示的值和要存储和的值不一样的问题,如何处理?
- C#
- C# 实体类与数据库之间的关系
{
//发送到接口的代码........ //函数退出前填出提示
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("发送成功");
}
但是还是卡住啊,所以我用那个,但是也卡住,
一开始我是这样的,
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() //用线程去控制发送到接口
{
//发送到接口的代码........
}但是这样也卡住,不行啊,所以想用异步调用的方式,网上说可以解决卡住的情况,可事实上没有解决,是不是我用的不对还是?