Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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# 我如何安全地调用一个偶尔会将CPU运行到99%的方法?_C#_Asp.net Mvc_Ikvm - Fatal编程技术网

C# 我如何安全地调用一个偶尔会将CPU运行到99%的方法?

C# 我如何安全地调用一个偶尔会将CPU运行到99%的方法?,c#,asp.net-mvc,ikvm,C#,Asp.net Mvc,Ikvm,我正在使用由第三方供应商开发的服务器API。API以.jar文件的形式出现,但由于我们希望在ASP.NETMVC应用程序中使用它,因此我们使用IKVM将其转换为DLL。这个解决方案在大多数情况下都很有效 然而,有一天,我收到一些来自用户社区的投诉,称我们的应用程序在一台服务器上运行缓慢。所以我检查了一下,发现运行IIS应用程序池的w3wp.exe工作进程的CPU使用率为99%(通常低于10%)。我将dotTrace的一个实例附加到w3wp.exe,发现“热点”可以追溯到服务器API调用的一些Ja

我正在使用由第三方供应商开发的服务器API。API以.jar文件的形式出现,但由于我们希望在ASP.NETMVC应用程序中使用它,因此我们使用IKVM将其转换为DLL。这个解决方案在大多数情况下都很有效

然而,有一天,我收到一些来自用户社区的投诉,称我们的应用程序在一台服务器上运行缓慢。所以我检查了一下,发现运行IIS应用程序池的w3wp.exe工作进程的CPU使用率为99%(通常低于10%)。我将dotTrace的一个实例附加到w3wp.exe,发现“热点”可以追溯到服务器API调用的一些Java输入流读取方法:

java.io.BufferedInputStream.getBufIfOpen
java.io.BufferedInputStream.fill
java.io.BufferedInputStream.read(Byte[], Int32, Int32)
java.net.SocketInputStream.read(Byte[], Int32, Int32)
java.io.BufferedInputStream.read1(Byte[], Int32, Int32)
进一步看一下我们自己的源代码,我相信我已经发现了我们这边令人不快的一句话:

messageDataBytes = dataConnector.getInputStream().read();
这句话似乎很天真。为什么它会让CPU运行到99%?我如何从应用程序中安全地调用这些方法,并防止这些方法中的任何错误行为对整个应用程序产生负面影响

我最初的想法是从一个单独的线程调用这些方法,如果在一段时间后没有完成,我可以杀死它。我走对了吗


如果您有任何想法和建议,我们将不胜感激。

该行是否在循环中,并且它始终返回0或错误值?或者它在一次调用中消耗了所有的时间?如果我不得不猜测,我会说单个调用消耗了所有的时间。@如果您不需要猜测,请在跟踪模式下而不是在采样模式下重新运行点跟踪,它将给出函数被调用的确切次数。如果你能分辨出是一个执行时间长的单次调用,还是多个执行时间短的短调用,我建议的第一步是确认一个或另一个理论。如果是第一个,则循环无法以理想的方式处理(意外)返回值。如果。。。嗯…@ScottChamberlain不幸的是,在过去几年中,我只见过一次这个问题,所以这是一个罕见的事件。如果它再次出现,我可以再次运行dotTrace。