| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 1900 人关注过本帖
标题:如何关闭一个阻塞的线程
只看楼主 收藏
某一天
Rank: 2
等 级:论坛游民
威 望:1
帖 子:33
专家分:77
注 册:2015-6-15
结帖率:0
  已结贴   问题点数:10  回复次数:4   
如何关闭一个阻塞的线程
比如线程停留在AutoResetEvent.WaitOne()处,
而当外部情况变化其之后的代码不再需要执行了,需要强制关闭

 用abort不行,因为线程本身是永久阻塞的,
 用IsBackground也不行,因为只能关闭这一个线程而不退出程序
搜索更多相关主题的帖子: 如何  
2015-08-31 11:16
ggynima
Rank: 2
等 级:论坛游民
帖 子:22
专家分:25
注 册:2015-8-31
  得分:5 
是否可以用dispose()
2015-08-31 23:44
jmm_ing
Rank: 2
等 级:论坛游民
帖 子:5
专家分:25
注 册:2015-9-5
  得分:5 
把线程设的IsBackground设为true,你可以在AutoResetEvent.WaitOne()的另一个分支里边加一个标记是否退出的条件判断,如果标记量为false那个直接退出循环自动退出线程,目前你的线程停留在AutoResetEvent.WaitOne()处,你可以先把标记量设为false,然后调用AutoResetEvent对象的Set()方法激活,让程序执行到AutoResetEvent对象的WaitOne()方法的另一个分支去,在另外一个分支里判断标记量为false就可以安全的退出线程的,我一般不会去用线程的abort方法。

举个例子:
bool ok = false;
AutoResetEvent are = new AutoResetEvent(false);

 while(true)
{
      if (bOk)
      {
           if(bFalg)
           {
                break;
           }
           Console.WriteLine("你好");
           Thread.Sleep(1000);
      }
      else
      {
           Console.WriteLine("我等待");
          are.WaitOne();
      }
}

bOk和bFalg为bool类型,想要退出线程只需要把bFalg设为false,调用are.Set();

希望对你有用
2015-09-05 21:55
leisiege
Rank: 4
等 级:业余侠客
威 望:8
帖 子:95
专家分:235
注 册:2015-10-22
  得分:0 
感觉thread没有task好用。task还有统一线程取消模型。很方便的取消线程。thread感觉已经落伍了。
2015-10-22 16:31
某一天
Rank: 2
等 级:论坛游民
威 望:1
帖 子:33
专家分:77
注 册:2015-6-15
  得分:0 
回复 4楼 leisiege
谢谢了
2015-11-17 11:13







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045110 second(s), 7 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved