C#中的无限While循环,CPU使用率100%
我有一个间歇产生数据的web响应流。无法知道此通道何时接收数据 为了读取应用程序中的所有数据,我使用了while(true),这将导致100%的CPU使用率 我不能使用ManualResetEvent,因为应用程序必须一直从流中读取数据。只要接收到数据,这就可以正常工作,但当流中没有数据时,其他线程就无法获得足够的CPU时间来处理。 我的代码如下所示:-C#中的无限While循环,CPU使用率100%,c#,while-loop,cpu-usage,C#,While Loop,Cpu Usage,我有一个间歇产生数据的web响应流。无法知道此通道何时接收数据 为了读取应用程序中的所有数据,我使用了while(true),这将导致100%的CPU使用率 我不能使用ManualResetEvent,因为应用程序必须一直从流中读取数据。只要接收到数据,这就可以正常工作,但当流中没有数据时,其他线程就无法获得足够的CPU时间来处理。 我的代码如下所示:- StreamReader streamReader = new StreamReader(httpResponse.GetResponseSt
StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream());
while(true)
{
int charvalue = streamReader.Read();
// More code to process data read above
}
我不想使用Thread.Sleep(),因为它会不必要地减慢我的应用程序的速度,并且在该线程上没有接收到数据时仍希望其他线程进行处理。创建一个异步方法,并使用wait Task.Delay()执行此操作
然后调用它,它将在后台运行。让它将您的结果传递到某个队列,然后您就可以随意使用这些结果,将数据排到列表中,并对其执行任何您想要的操作。它是否会阻止
读取
?您需要有以外的条件,而(true)
,否则它将永远持续下去。我猜你的循环中也没有一个break
?好吧,thread.Sleep()是答案,它只会休眠你当前的线程,是的,如果你没有要读取的数据,只需休眠一段时间,然后再次检查(charvalue=-1)breakRead()
应该一直阻止,直到下一个字符可用为止,除非到达流的末尾,在这种情况下,它确实会返回-1
,而不会阻塞。但如果流已经结束,它无论如何都不能“恢复”,所以只需检查-1
并中断循环即可。
public async void ReadFromStream(StreamReader streamReader)
{
while(true)
{
int charvalue = streamReader.Read();
await Task.Delay(1000);
// add this data to some list, queue or something else so you could use it somewhere else easily and then just use this data in your other methods
}
}