C# 线程问题!

z812183667 2012-03-08 03:57:24
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();
}
如上 我在按钮里面开启了一个线程

然后如果我不停的点击按钮
过一会就报错!线程正在终止!
求教!
...全文
211 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
z812183667 2012-03-14
  • 打赏
  • 举报
回复
谢谢大家问题面前解决了!
if (!((td.ThreadState & (System.Threading.ThreadState.AbortRequested | System.Threading.ThreadState.Unstarted)) == 0))
{
  • 打赏
  • 举报
回复
最好把你要开的那个线程定义成全局的,在每次开之前判断线程是否正在运行,如果是就关闭线程然后再重新开启。

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();

}

xnlm2005 2012-03-13
  • 打赏
  • 举报
回复
你这个不用多线程可以解决的啊,你这个不就是那个加载界面的问题吗?你查查,许多这样的帖子,就是先在等待窗体里面把对象初始化好,然后显示主界面。你如果用多线程,他们齐头并进你怎么控制流程啊?
z812183667 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xnlm2005 的回复:]
CPU一秒钟几亿次,这点问题还多线程,浪费资源啊。
[/Quote]
不用多线程 等待窗体怎么出来啊!就是开一个线程然后在里面显示窗体啊!
xnlm2005 2012-03-08
  • 打赏
  • 举报
回复
CPU一秒钟几亿次,这点问题还多线程,浪费资源啊。
xnlm2005 2012-03-08
  • 打赏
  • 举报
回复
这里不用多线程行吗?
z812183667 2012-03-08
  • 打赏
  • 举报
回复
主要是同一个线程的频繁开启和关闭问题!不知道该怎么解决!
z812183667 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xnlm2005 的回复:]
TD.Abort();
TD.Join();
这句就有问题,abort后,就不能join了。
[/Quote]
我做了一个小程序 有托盘 点击托盘的时候 弹出主程序 主程序弹出之前先出现一个等待界面!
然后主窗体显示正常后 就把等待界面关掉
所以这个打开等待界面和关闭等待界面的频率是很高的!就出现了同一个线程的频繁开启关闭!
qq4651834 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xnlm2005 的回复:]
TD.Abort();
TD.Join();
这句就有问题,abort后,就不能join了。
[/Quote]
这就没有问题,abort()后线程不一定结束,threadstate可能还是true,用join()是为了确保该线程结束,threadstate变为false
xnlm2005 2012-03-08
  • 打赏
  • 举报
回复
Thread.Sleep(1000); 这句也有问题,界面会卡死1秒,哎,问题太多了。
xnlm2005 2012-03-08
  • 打赏
  • 举报
回复
还有就是,你那么急abort干嘛?要不另做一个按钮来干这种事,你这有点乱了。
xnlm2005 2012-03-08
  • 打赏
  • 举报
回复
TD.Abort();
TD.Join();
这句就有问题,abort后,就不能join了。
labid6968 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 z812183667 的回复:]

引用 2 楼 libinguest 的回复:
线程没有执行结束时禁止再次点击。


最好的办法是异步执行。

怎么判断线程没有执行结束?
异步执行?能说的清楚点吗?我对线程不太熟悉!
[/Quote]
线程对象有一个 ThreadState 属性是查询线程状态的。
z812183667 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 libinguest 的回复:]
线程没有执行结束时禁止再次点击。


最好的办法是异步执行。
[/Quote]
怎么判断线程没有执行结束?
异步执行?能说的清楚点吗?我对线程不太熟悉!
ziyouli 2012-03-08
  • 打赏
  • 举报
回复
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;
}
风之影子 2012-03-08
  • 打赏
  • 举报
回复
线程没有执行结束时禁止再次点击。


最好的办法是异步执行。
z812183667 2012-03-08
  • 打赏
  • 举报
回复
各位大牛!请指教!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧