停止线程不起作用

本文关键字:不起作用 线程 | 更新日期: 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的方式,你希望它会。