社区
C#
帖子详情
求救:如何清除掉一个处于死循环的线程,在线等。
qiezic
2005-02-03 03:20:53
我曾试图用Abort()终止该线程,但使用Abort()后,该线程状态一直保持AbortRequested,而不是Stopped。
请高手指教……
...全文
237
25
打赏
收藏
求救:如何清除掉一个处于死循环的线程,在线等。
我曾试图用Abort()终止该线程,但使用Abort()后,该线程状态一直保持AbortRequested,而不是Stopped。 请高手指教……
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
编程资料 -C# 多
线程
编程资料 - 多
线程
C#多
线程
编程实例实战作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读次数:10996单个写入程序/多个阅读程序在.Net 类库中其实已经提供了实现,即System.Threading.ReaderWriterLock 类。本文通过对常见的单个写入/多个阅读程序的分析来探索c#的多
线程
编程。问题的提出所谓单个写入程序/多个阅读
mysql查看
线程
详解(转载)
如果有 SUPER 权限,则可以看到全部的
线程
,否则,只能看到自己发起的
线程
(这是指,当前对应的 MySQL 帐户运行的
线程
)。 mysql> show processlist; +—–+————-+——————–+ | Id | User | Host | db | Command | Time| State | Info +—–+————-+——————–+ |207|ro...
mysql查看
线程
详解
如果有 SUPER 权限,则可以看到全部的
线程
,否则,只能看到自己发起的
线程
(这是指,当前对应的 MySQL 帐户运行的
线程
)。mysql> show processlist;+—–+————-+——————–+| Id | User | Host | db | Command | Time| State | Info+—–+————-+——————–+|207|roo...
C/C++笔试题
1.static有什么用途?(请至少说明两种)
1)在函数体,
一个
被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),
一个
被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是
一个
本地的全局变量。
3) 在模块内,
一个
被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
2.引用与指针有什么区别?
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章