停止线程不起作用
本文关键字:不起作用 线程 | 更新日期: 2023-09-27 18:07:14
我有一个方法侦听通过流发送的数据。因为网络流。read方法是同步的,我必须在一个单独的线程上执行。所以我在一个单独的线程上执行的方法是:
void someMethod(param1, param2....)
{
try{
while( stream.read(data...) != 0 ) // code waits here until data is received
{
// do stufff
}
}catch{}//
}
退出该线程的唯一方法是关闭流,然后执行catch块。我有时需要在同一流上开始侦听数据,但使用不同的方法。因此,如果我创建线程为thread t = new thread (new threadstart(someemethod ......)然后执行t.start(someObject);稍后当我执行t.abort();该方法仍将监听数据。我如何终止它?
我也试过创建一个全局变量,如:
bool someBoolean = false;
void someMethod(param1, param2....)
{
try{
while(someBoolean ==false && stream.read(data...) != 0 ) // code waits here until data is received
{
// do stufff
}
}catch{}//
}
,然后我想我改变someBoolean为true,方法将停止执行。出于某种原因,它没有。为什么?好像someBoolean同时是两个变量。因为从主线程改变它的值似乎不会影响到第二个线程…
我猜线程可能被中止,但随后该线程的资源(由于流而未管理)将不会被释放-这是你的问题。
不要用abort来停止线程。
停止它,尝试使用异步版本的流。与CancellationToken一起读取。如果你给我们更多的信息(什么流?-阅读是奇怪的("R"读?),线程的开始)我可能会尝试给你更多的细节。
PS:试着用System.Threading.Task代替threads,这样更好用。
作为没有进一步信息的快速修复,您可以尝试这样做:
ManualThreadEvent terminate = new ManualThreadEvent(false);
bool someBoolean = false;
void someMethod(param1, param2....)
{
try{
// wait for enough data or for termination:
while(terminate.WaitOne(100) == false && stream.DataAvaiable <= bytesNeeded)
{ /* nothing to do here */ }
if (terminate.WaitOne(0)) return; // terminate on request
// To your stuff with read
}catch{}//
}
void Terminate()
{
terminate.Set();
}
如何终止它?
解除阻塞流调用的标准协议是关闭流并捕获异常。中断读取以便将其移到另一个方法是相当不寻常的。如果您觉得这仍然是必要的,那么您应该在读操作上提供额外的间接级别。当使用像BeginRead
这样的异步调用而不是同步调用时,处理这样的场景要容易得多。通过Thread.Abort
终止一个线程可能会导致比它解决的更多的问题。
,然后我想我改变someBoolean为真,方法将停止执行。出于某种原因,它没有。为什么?它看起来像某个布尔值同时是两个变量。因为从主程序中改变它的值线程似乎不会对第二个线程产生影响…
这是可能的,缺乏内存屏障可能会导致这个问题,但更可能的原因是,线程卡在Read
,并没有实际读取someBoolean
的方式,你希望它会。