求救:如何清除掉一个处于死循环的线程,在线等。

qiezic 2005-02-03 03:20:53
我曾试图用Abort()终止该线程,但使用Abort()后,该线程状态一直保持AbortRequested,而不是Stopped。
请高手指教……
...全文
237 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiezic 2005-02-05
  • 打赏
  • 举报
回复
哈哈
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
>>另一个线程专门接收文件包,其中包含接收消息和包,一但收到包该线程代码就结束了(一个包就new一个这样的线程)

你的意思是说,侦听线程一收到包就结束了,然后主线程再启一个侦听线程?那怎么行,那么有些数据包可能在新的侦听线程还没启动之前就到了,会造成丢包啊~

建议使用生产者、消费者模式,侦听线程只负责收包(相当于生产者),不停地把收到的包(byte[])放到 ArrayList(这相当于消息队列),然后启动一个~N个消费者线程来处理ArrayList 里的数据包。这样逻辑简单多了~
qiezic 2005-02-04
  • 打赏
  • 举报
回复
一个是随着程序运行就开始的线程(相当与服务器,负责消息应答)
另一个线程专门接收文件包,其中包含接收消息和包,一但收到包该线程代码就结束了(一个包就new一个这样的线程)
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
为什么要搞两个侦听线程?一个足够了,当Receive 返回 byte[] 后,启动一个消费者线程来处理byte[]数据,.Net又透明实现了 Thread Pooling,速度很快的。
qiezic 2005-02-04
  • 打赏
  • 举报
回复
因为现在我的关键问题是两接收包线程只有一个可以收到包另一个却不收不到包,不知为什么吗?
程序的色彩 2005-02-04
  • 打赏
  • 举报
回复
[DllImport("kernel32.dll", SetLastError=true)]
public static extern int TerminateThread(
int hThread,
int dwExitCode
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
API也不是很麻烦啊,参数才2个,真懒~
qiezic 2005-02-04
  • 打赏
  • 举报
回复
主啊!
我还是先接收任意包,再判断算了!
以后试了可以,再告诉你!
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
既然楼主这样决心要杀掉线程,恐怕只能借助Windows API 了:步骤如下——

(1)在侦听线程启动时,记下线程的Handle,用下面这个API:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern int GetCurrentThread(void);

(2)退出时强制杀掉侦听线程,用这个API:
[DllImport("kernel32.dll", SetLastError=true)]
public static extern int TerminateThread(
int hThread,
int dwExitCode
);


我自己没试验过,楼主帮试验一下,多谢啦!
qiezic 2005-02-04
  • 打赏
  • 举报
回复
如果在Receive(ref ip)指定IP那就不行了!
所以我想知道如何:清除掉一个处于卡死状态的线程(使该线程状态为Stopped)
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
>> 如果在线程里有一句接收数据报的代码,但它没收到数据报时会永远卡在那里,即使加开关变量有没用


这个问题简单啊,你在退出的时候,向自己侦听的端口发一个消息,Accept()方法不就返回了吗?
qiezic 2005-02-04
  • 打赏
  • 举报
回复
UdpClient的Receive()语句在没收到包的情况下会一直等待,不会循环。
所以加判断没用!
redlotoc 2005-02-04
  • 打赏
  • 举报
回复
那你就判断没有收到数据时,退出,或者需要等待多长时间在没有收到数据退出
qiezic 2005-02-04
  • 打赏
  • 举报
回复
如果在线程里有一句接收数据报的代码,但它没收到数据报时会永远卡在那里,即使加开关变量有没用
dandanwar 2005-02-04
  • 打赏
  • 举报
回复
如果你是使用线程池,比如,这样;
static AutoResetEvent asyncOpIsDone = new AutoResetEvent(false);
asyncOpIsDone.Reset();
ThreadPool.QueueUserWorkItem(new WaitCallback(ActionPool),Msn);
asyncOpIsDone.WaitOne();
那么在WaitOne()阻塞的时候,线程无法收到响应的话,我告诉你,借你的春风,我也问一下,怎么弄,好像微软只有阻塞线程,这句是让线程同步的,但是我不能让他一直等吧,寻高人指点
qiezic 2005-02-04
  • 打赏
  • 举报
回复
fjfz
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
呵呵,预祝我们打工的都春节快乐。
qiezic 2005-02-04
  • 打赏
  • 举报
回复
哎,为什么会收不到包呢!郁闷!

回答了这么多回还没谢你呢,就祝你春节快乐!
FJGoodGood 2005-02-04
  • 打赏
  • 举报
回复
感觉“...然后在new 一个接收新的消息和包...”这样不是很可靠,我的方法在上面已经讲过了,看看有没有高人说说其他的方法。。。
qiezic 2005-02-04
  • 打赏
  • 举报
回复
FJGoodGood(_FJ_强中强):那该怎么处理啊 ?
加载更多回复(5)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧