注册 登录
编程论坛 C# 论坛

如何关闭一个阻塞的线程

某一天 发布于 2015-08-31 11:16, 1911 次点击
比如线程停留在AutoResetEvent.WaitOne()处,
而当外部情况变化其之后的代码不再需要执行了,需要强制关闭

 用abort不行,因为线程本身是永久阻塞的,
 用IsBackground也不行,因为只能关闭这一个线程而不退出程序
4 回复
#2
ggynima2015-08-31 23:44
是否可以用dispose()
#3
jmm_ing2015-09-05 21:55
把线程设的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();

希望对你有用
#4
leisiege2015-10-22 16:31
感觉thread没有task好用。task还有统一线程取消模型。很方便的取消线程。thread感觉已经落伍了。
#5
某一天2015-11-17 11:13
回复 4楼 leisiege
谢谢了
1