为什么线程进入睡眠模式C#

时间:2012-08-15 05:58:08

标签: c# .net multithreading

我的代码运行了大约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

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

还不够吗?我可以为完整的线程设置某种超时。如果它没加入5000毫秒就杀了吗?

2 个答案:

答案 0 :(得分:3)

“做一些网络的东西”将是我第一眼看到的东西(特别是:它是否有可能无限期地阻止 - 可能是Read没有超时的流没有发送但是没有关闭了。如果任何“执行一些网络内容”代码阻止,则会阻止整个Parallel.ForEach,因为它不会从.ForEach返回,直到每个项目完成。< / p>

查找等待加入的Parallel.ForEach并非出乎意料(Parallel.ForEach 分裂并加入) - 重要的问题是:还有什么正在发生,即其他线程在做什么。

但是,我还想询问是否有人可能只是在键盘上按 pause (暂停控制台输出),或者在控制台区域(可以进入)意外点击拖动复制/粘贴模式,它再次暂停控制台输出。)

答案 1 :(得分:1)

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

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

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