C# resume 线程不是用户挂起的, 无法使其继续

这篇博客讨论了在C#中使用线程时遇到的问题,即尝试对未被用户挂起的线程调用Resume()方法导致的错误。作者分享了他们的代码片段,最初通过isStopped标志来控制线程暂停和恢复,后来发现应直接检查线程状态以避免错误。虽然微软不推荐使用Suspend()和Resume(),但在这特定场景中,作者选择了使用并提醒注意可能的死锁风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近因为工作需要,写了一个小程序。
背景是这样的:
     我有一个线程,要在系统有空闲的内存或者是特定的程序没有执行时开启;而条件不符合时处于阻塞状态。
一开始,我的代码是:

int checkInterval = 3000;
bool isStopped = false;
 while (true)
            {
                if (IsSpiderHasToStop())
                {
                    Console.WriteLine("spider wait....");
                    t.Suspend();
                    isStopped= true;

                }
                else if (isStopped)
                {
                    Console.WriteLine("spider restart....");
                    t.Resume();
                }
             
                Thread.Sleep(checkInterval);
            }
然而执行过程中出现:C# resume 线程不是用户挂起的, 无法使其继续
原因是:在执行了一次Resume之后,我没有将标记isStopped重新置为false。由此导致了Resume方法执行了多次。

其实,一种更好的做法是不要使用isStopped的判断标记,而是直接根据线程的状态进行判断。如下:
while (true)
            {
                if (IsSpiderHasToStop())
                {
                    Console.WriteLine("spider wait....");
                    t.Suspend();

                }
                else if (t.ThreadState == ThreadState.Suspended)
                {
                    Console.WriteLine("spider restart....");
                    t.Resume();
                }
             
                Thread.Sleep( checkInterval );
            }

当然,线程的Suspend()和Resume()方法微软已经建议不要使用了,因为有可能会出现死锁,不过,这两个方法刚好可以简单地实现我的需求。所以就用啦。只不过,要当心!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值