编程论坛
注册
登录
编程论坛
→
C# 论坛
如何关闭一个阻塞的线程
某一天
发布于 2015-08-31 11:16, 1911 次点击
比如线程停留在AutoResetEvent.WaitOne()处,
而当外部情况变化其之后的代码不再需要执行了,需要强制关闭
用abort不行,因为线程本身是永久阻塞的,
用IsBackground也不行,因为只能关闭这一个线程而不退出程序
4 回复
#2
ggynima
2015-08-31 23:44
是否可以用dispose()
#3
jmm_ing
2015-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
leisiege
2015-10-22 16:31
感觉thread没有task好用。task还有统一线程取消模型。很方便的取消线程。thread感觉已经落伍了。
#5
某一天
2015-11-17 11:13
回复 4楼 leisiege
谢谢了
1