日期:2014-05-18  浏览次数:20985 次

C# 线程问题!
private void button1_Click(object sender, EventArgs e)
  {
  Thread TD = new Thread(showwaitfrm);
  TD.Start();
  Thread.Sleep(1000); dataGridView1.DataSource = getdate();
  TD.Abort();
  TD.Join();
  }
如上 我在按钮里面开启了一个线程

然后如果我不停的点击按钮  
过一会就报错!线程正在终止!
求教!

------解决方案--------------------
线程没有执行结束时禁止再次点击。


最好的办法是异步执行。
------解决方案--------------------
C# code
private void button1_Click(object sender, EventArgs e)
  {
  button1.Enabled = false;
  Thread TD = new Thread(showwaitfrm);
  TD.Start();
  Thread.Sleep(1000); 
  dataGridView1.DataSource = getdate();
  TD.Abort();
  TD.Join();
  while(TD.ThreadState != System.Threading.ThreadState.Stopped) Application.DoEvents();
  button1.Enabled = true;
  }

------解决方案--------------------
探讨

引用:
线程没有执行结束时禁止再次点击。


最好的办法是异步执行。

怎么判断线程没有执行结束?
异步执行?能说的清楚点吗?我对线程不太熟悉!

------解决方案--------------------
探讨
TD.Abort();
TD.Join();
这句就有问题,abort后,就不能join了。

------解决方案--------------------
你这个不用多线程可以解决的啊,你这个不就是那个加载界面的问题吗?你查查,许多这样的帖子,就是先在等待窗体里面把对象初始化好,然后显示主界面。你如果用多线程,他们齐头并进你怎么控制流程啊?
------解决方案--------------------
最好把你要开的那个线程定义成全局的,在每次开之前判断线程是否正在运行,如果是就关闭线程然后再重新开启。

Thread TD=null;
private void button1_Click(object sender, EventArgs e)
{
if(TD!=null&&TD.IsAlive==True)
TD.Abort();
Thread TD = new Thread(showwaitfrm);
TD.Start();
Thread.Sleep(1000); dataGridView1.DataSource = getdate();
TD.Abort();

}