C#-尝试在.Net Framework函数上捕获过多的CPU

C#-尝试在.Net Framework函数上捕获过多的CPU,c#,C#,Im使用一个循环,通过TCP流等连接到多个服务器。 每当其中一个流出现IOExceptions之类的常规异常时,它都会将调试信息返回给System.Diagnostics.debug,从而导致大量CPU 我以前也遇到过类似的问题,异常会导致大量CPU。我删除了代码,并将其替换为一个函数bool return system,在该函数中,它不会抛出异常,而只会返回true/false,true=正常,false=出错。这是可能的,因为有些函数是异步的,我可以等待它们并返回true/false,或者它

Im使用一个循环,通过TCP流等连接到多个服务器。 每当其中一个流出现IOExceptions之类的常规异常时,它都会将调试信息返回给System.Diagnostics.debug,从而导致大量CPU

我以前也遇到过类似的问题,异常会导致大量CPU。我删除了代码,并将其替换为一个函数bool return system,在该函数中,它不会抛出异常,而只会返回true/false,true=正常,false=出错。这是可能的,因为有些函数是异步的,我可以等待它们并返回true/false,或者它只是作为bool返回

但是对于溪流,我没有这个选择

由于它被抓到和扔到哪里,我认为无论如何都没有办法真正缓解这个问题

我基本上只需要忽略命令抛出的异常,而不需要抛出它们。
有没有一种方法可以重写该函数并稍微修改一下?

操作系统函数使用返回值和线程最后一次错误状态,没有异常。因此,您可以使用p/invoke直接调用API并处理返回值,从而避免异常开销

NetworkStream
代码重写为socketsapi需要做大量的工作,因此我建议在执行之前(使用分析器)证明这是一个主要问题


如果您不介意使用未记录的内部构件,另一个选项是使用
IAsyncResult
对象实际上是一个
System.Net.lazyancresult
包含
ErrorCode
属性的事实。使用反射的魔力阅读是可能的,但是反射可能比异常处理还要慢,因此您需要进行一次反射,然后保存一个委托以备将来使用

请注意,当框架代码识别错误代码时,它会做两件事

  • 调整/清除内部状态
  • 抛出异常
如果您通过自己检查错误代码来避免这种情况,那么还需要调用执行清理的未记录方法。在
EndConnect
的情况下,这是
TcpClient
的内部
Socket
实例上的
UpdateStatusAfterSocketError


与使用p/invoke重写所有内容相比,工作量更少,但更脆弱,因为它依赖于Microsoft将来可能更改的实现细节。

异常会对cpu造成负担。他们必须切换上下文。@DanielA.White对,但我预计每分钟100个,这会对CPU性能造成巨大损失。那么,真的没有什么可以做的了吗?分享你的代码,我猜有人可能会帮助我,我不直接做太多的w/tcp套接字。每分钟数百个应该不会造成问题。百分之一百的每秒,百分之一百的每秒,我想是相当重要的。(CPU可以在一分钟内完成很多工作…)你测量过你实际经历了多少吗?@DaisyShipton每3分钟得到13000个。