Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么线程会进入睡眠模式C_C#_.net_Multithreading - Fatal编程技术网

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

C# 为什么线程会进入睡眠模式C,c#,.net,multithreading,C#,.net,Multithreading,我有这个代码,运行了大约2个小时。之后,程序停止应答,我在VS中暂停它,并检查它在哪一行执行。我在Parallel语句中停了下来,说了一些关于等待线程加入并停止睡眠的事情 很明显,我的多线程经验很少,所以我不知道为什么会发生这种情况。 我认为进入while的线程将被隔离,并等待在foreach中启动的所有其他线程 while (true) { Parallel.ForEach(servers, server => // It stopped here

我有这个代码,运行了大约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

DoSome network stuff是在1500毫秒的超时时间内进行UDP发送和接收。我这里还有一些基于实体框架的DB内容。因此,可能会出现很多问题。然而,我仍然不确定是什么原因造成的。如果套接字my UDP stuff和DB stuff都在运行并且超过了超时时间,它们将引发一个将被处理的异常


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

我特别关注的第一件事是Do some network(做一些网络工作):它是否有可能无限期地阻塞—可能是在未发送但未关闭的流上进行无超时的读取。如果任何DoSome network stuff代码阻塞,这将阻塞整个Parallel.ForEach,因为在每个项目完成之前,它不会从.ForEach返回

找到等待连接的Parallel.ForEach并不是意外的Parallel.ForEach毕竟是一个拆分和连接-重要的问题是:还发生了什么,即其他线程在做什么


但是,我还想问,是否有人只是在暂停控制台输出的键盘上按了暂停键,或者无意中在控制台区域上单击并拖动了鼠标,从而可以进入复制/粘贴模式,这会再次暂停控制台输出。

我特别关注的第一件事是Do some network(做一些网络)功能:它是否有可能无限期地阻塞—可能是对未发送但未关闭的流进行无超时读取。如果任何DoSome network stuff代码阻塞,这将阻塞整个Parallel.ForEach,因为在每个项目完成之前,它不会从.ForEach返回

找到等待连接的Parallel.ForEach并不是意外的Parallel.ForEach毕竟是一个拆分和连接-重要的问题是:还发生了什么,即其他线程在做什么


但是,我还想问,是否有人只是简单地按下键盘上的暂停键,暂停控制台输出,或者无意中点击了控制台区域上的拖动,从而进入复制/粘贴模式,再次暂停控制台输出。

如果您希望这只需要几秒钟,在不使用Parallel.ForEach的情况下运行代码,然后您就可以很容易地看到阻塞的内容,因为这些内容都在主线程上

如果您在VS2010上执行此操作,那么您还可以通过使用VisualStudio中的并行堆栈调试窗口来查看发生了什么。请看这里:


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

如果您希望这只需要几秒钟的时间,请在不使用Parallel.ForEach的情况下运行代码,这样您就可以很容易地看到阻塞的原因,因为所有阻塞都在主线程上

如果您在VS2010上执行此操作,那么您还可以通过使用VisualStudio中的并行堆栈调试窗口来查看发生了什么。请看这里:


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

好的,我不明白。套接字会启动更多线程吗?线程池不是专用于我的程序还是在.NET中共享的?是的,线程池是每个进程的,所以专用于你的程序;但是,如果一些dosomenetwork元素可以无限期地阻塞,那么将无限期地停止整个Parallel.ForEach。我们看不到一些网络的东西能做什么,所以我们不能对此发表评论。好吧,我不明白。套接字会启动更多线程吗?线程池不是专用于我的程序还是在.NET中共享的?是的,线程池是每个进程的,所以专用于你的程序;但是,如果一些dosomenetwork元素可以无限期地阻塞,那么将无限期地停止整个Parallel.ForEach。我们看不到一些网络的东西能做什么,所以我们不能对此发表评论-@SimonEdström进行了更新,然后又归结到:有什么问题
其他线程正在执行。要调试这个,你需要查看的不仅仅是主线程。好的,但是我可以假设即使我没有启动很多线程,这个错误也会发生吗?@Simon调试线程代码时,你不能假设任何事情。你需要弄清楚。但是:它不应该只是自发地停止。这个循环没有明显的问题,所以有些地方出了问题。这可能是一个框架错误,或者更可能是一个框架错误?我更新了我的问题,补充了一些关于神秘网络的信息-@SimonEdström进行了更新,然后又归结到:其他线程在做什么。要调试这个,你需要查看的不仅仅是主线程。好的,但是我可以假设即使我没有启动很多线程,这个错误也会发生吗?@Simon调试线程代码时,你不能假设任何事情。你需要弄清楚。但是:它不应该只是自发地停止。这个循环没有明显的问题,所以有些地方出了问题。这可能是一个框架错误,或者更可能是一个框架错误?可能是一些意外地使您的代码暂停。。。