【问题标题】:Why does thread go to sleep mode C#为什么线程进入睡眠模式C#
【发布时间】:2012-08-15 05:58:07
【问题描述】:

我的这段代码运行了大约 2 个小时。之后程序停止回答,我在 VS 中暂停它并检查它在哪一行执行。我在 Parallel 语句中停下来,说了一些关于“等待线程加入并停止睡眠”的内容。

很明显,我的多线程经验很少,所以我不知道为什么会发生这种情况。 我认为进入 while 的线程将被隔离并等待在 foreach 中启动的所有其他线程。

while (true)
        {
        Parallel.ForEach(servers, server => // It stopped here
        {

            Console.WriteLine(string.Format("Checking: {0} Thread: {1}", server.Hostname, Thread.CurrentThread.ManagedThreadId));
            try
            {
               // Do some network stuff
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message.ToString());
            }
        });
}

更新 1

做一些网络工作是在 1500 毫秒内进行一些 UDP 发送和接收超时。我这里也有一些基于实体框架的数据库。所以很可能会出错。但是我仍然不确定是什么原因造成的。如果套接字(我的 UDP 东西和 DB 东西)正在运行并超过超时,它们将引发一个将被“处理”的异常

这还不够吗?我可以为整个线程设置某种超时。如果它还没有加入 5000 毫秒杀死它?

【问题讨论】:

  • 好吧,我不明白。套接字会启动更多线程吗?线程池不是专用于我的程序还是与 .NET 共享?
  • 是的,线程池是每个进程的,因此专用于您的程序;但是,如果某些“做一些网络事情”可以无限期地阻止,那将无限期地停止整个Parallel.ForEach。我们看不到“做一些网络事情”的作用,因此我们无法对此发表评论。

标签: c# .net multithreading


【解决方案1】:

“做一些网络工作”将是我看到的第一件事(特别是:它是否有可能无限期阻止 - 可能是 Read 在没有发送但没有发送的流上没有超时关闭)。如果有任何“Do some network stuff”代码块,这将阻止整个 Parallel.ForEach,因为它不会从 .ForEach 返回,直到 每个 项目完成。

发现 Parallel.ForEach 等待加入并不意外(Parallel.ForEach 毕竟是拆分和加入) - 重要的问题是:还有什么事情发生 em>,即其他线程在做什么。

但是,我还想问一下是否有人可能只是在键盘上按了 pause (暂停控制台输出),或者不小心点击了控制台区域(可以输入复制/粘贴模式,这会再次暂停控制台输出)。

【讨论】:

  • 我更新了我的问题,提供了有关神秘网络的更多信息;-)
  • @SimonEdström 更新,然后又归结为:其他线程在做什么。要调试它,您需要查看的不仅仅是主线程。
  • 好的,但我可以假设即使我没有启动很多线程也会发生此错误吗?
  • @Simon 在调试线程代码时,你不能假设任何东西。你需要确定一下。但是:它不应该只是自发停止。循环没有明显的问题,所以 something 是错误的。它可能是一个框架错误,或者它可能(更有可能,也许?)是一些意外地让你的代码停滞不前的东西......
【解决方案2】:

如果您希望这只需几秒钟,请运行不带 Parallel.ForEach 的代码,然后您将能够轻松查看阻塞的内容,因为它们都在您的主线程上。

如果您在 VS2010 上执行此操作,那么您还可以通过使用 Visual Studio 中的“并行堆栈”调试窗口来查看发生了什么。见这里:http://msdn.microsoft.com/en-us/library/dd998398.aspx

如果您没有多线程编程经验,那么我将从一个简单且标准的基于Thread 的程序开始,并在开始之前熟悉调试工具(例如,您将需要线程调试窗格)使用任务并行库 (Parallel.[...]) 进行调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多