Tag: 无限循环

无限循环消耗100%的CPU

我陷入了需要生成某个Hz的定义频率的情况。 我已经尝试过多媒体计时器和互联网上提供的所有其他东西,但到目前为止,一些if-else条件的无限循环给了我最好的结果。 但是这种方法的问题在于它消耗了几乎所有的cpu,没有其他应用程序正常工作的空间。 我需要一种算法,要么产生一些Hz到KHz的频率。 我正在使用带有C#的windows平台。

无限循环使TimeManager无效

我在WPF应用程序中遇到了一个非常棘手的缺陷,需要跟踪。 错误消息是: 在布局/渲染过程中反复使TimeManager失效会导致无限循环。 堆栈跟踪(它的价值)是: 在MS的System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback,Object args,Int32 numArgs)的System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)中的System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)处.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate方法,Object args,Int32 numArgs,Delegate catchHandler) 这是一个间歇性的缺陷,我唯一可以捕获它的地方是在app配置文件中,我正在捕获Application_DispatcherUnhandledException消息。 我在我的应用程序中拥有的所有内容都包含在try catch块中,但是这些内容会在捕获未处理的exception的地方结束。 有没有人对此有任何见解? 我在互联网上搜索了一些东西并且没有发现任何东西,并且想到这里可能有人可能有一些见解或想法如何追踪这一点。 目前,我正在吞下这个exception并让应用程序继续运行,因为它似乎对它没有任何影响(除了崩溃)。

快速重复TakeWhile导致无限循环

在stream.DataAvailable为false之前,如何进行以下可观察重复? 目前它看起来永远不会停止。 在Defer部分内的AsyncReadChunk和Observable.Return使OnNext调用然后OnCompleted调用。 当Repeat接收OnNext调用时,它将它传递给TakeWhile。 当TakeWhile不满意时,它完成了observable,但我认为在OnNext之后的OnCompleted是如此之快以至于它使Repeat重新订阅了observable并导致无限循环。 我该如何纠正这种行为? public static IObservable AsyncRead(this NetworkStream stream, int bufferSize) { return Observable.Defer(() => { try { return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0]); } catch (Exception) { return Observable.Return(new byte[0]); } }) .Repeat() .TakeWhile((dataChunk, index) => dataChunk.Length > 0); }

如何处理“无限”IEnumerable?

“无限”IEnumerable的一个简单例子 IEnumerable Numbers() { int i=0; while(true) { yield return unchecked(i++); } } 我知道 foreach(int i in Numbers().Take(10)) { Console.WriteLine(i); } 和 var q = Numbers(); foreach(int i in q.Take(10)) { Console.WriteLine(i); } 两者都工作正常(并打印出数字0-9)。 但是在复制或处理像q这样的表达式时是否有任何陷阱? 我可以依赖这样一个事实,即它们总是被评估为“懒惰”吗? 产生无限循环有危险吗?

在线程中的无限循环中,cpu使用率增加到100%

我在ASP.NET Web应用程序中实现了一个基于Web的聊天平台,我使用类似于长轮询的技术。 我的意思是我将来自客户端的每个Web请求保留特定时间段(超时)或直到新消息到达,然后将响应发送到客户端。 我将连接的客户端保留在内存中(字典对象),当有新消息发送到客户端时,我将此消息写入接收方客户端的消息数组中。 客户端需要发送请求以获取自己的消息,并将此请求保存在内存中的数组中。 我正在使用异步http处理程序来监听客户端请求,我将Web请求保存在内存中的数组中。 我使用线程从内存中连续检查新消息(在为每个客户端创建的字典中)。 我不使用.net线程池线程来检查新消息或超时web请求。我创建这样的线程: System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback)); t.IsBackground = false; t.Start(); 在每个线程的QueueCometWaitRequest_WaitCallback方法中,我处于无限循环中: while (true) { … Thread.Sleep(100); } 在这个方法中,我正在检查Web请求超时或每个Web请求的新消息,它也保存在内存中的数组中。 一切都很顺利,直到我注意到CPU使用率达到了100%的时间。 (在第一个连接的客户端之后的几分钟内)在第一个请求开始时,一切似乎都正常,我的意思是在向客户端返回响应时CPU使用率不高于10%。 但即使有2个客户端,CPU使用率也会增加到100%。 只有在写入客户端请求的响应时,CPU使用率似乎是100%。 如果没有客户端,那么一切都恢复正常(CPU使用率约为0%),直到客户端完成新的Web请求。 我不太详细地知道线程,但我怀疑我创建的新线程并且无限地工作。 这就像操作系统因为它们一直在工作而及时为它们提供更多的CPU使用和资源,并且这个Thread.Sleep(100)不起作用。 这是QueueCometWaitRequest_WaitCallback()方法: void QueueCometWaitRequest_WaitCallback() { while (true) { if (processRequest.Length == 0) { Thread.Sleep(100); } else { for (int i = 0; i […]