我的应用程序使用一些webservice并连接到服务器并位于系统托盘上。应用程序只读取用于连接服务器的第3部分应用程序(本地)。如果它读取任何不适当的行,则触发/处理适当的事件。塔尔是的。在我们的正常工作系统上进行了测试,它运行良好。在我的系统Quad 2.66GHz和3GB的RAM上,该应用程序消耗了25个CPU。
最近在包含2GB RAM系统的PIV 3.0Ghz系统上进行了检查,该应用程序占用了98个CPU。
这可能是什么?在更好的处理器上,该应用程序消耗的CPU几乎是我的4倍。为什么这样 ?可能是同样的原因。任何处理相同的想法。
连接后,这是活动的代码使用第三方应用程序运行cmd并使用此代码读取相同的输出:
private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
string d = e.Data;
if (!string.IsNullOrEmpty(d))
{
if (sb != null)
sb.Append(d + "\n");
//Console.WriteLine("LINE = " + d);
ERROR_CODE = -1;
if (d.IndexOf("Initialization Sequence Completed") >= 0)
{
connected = true;
Console.WriteLine("********* Connected = " + connected);
return;
} else if (isInValidLine(d))
{
if (d.IndexOf("Exiting") >= 0 || d.IndexOf("The requested name is valid but does not have an IP address.") >= 0)
{
if (caughtExp == false)
{
connected = false;
caughtExp = true;
errorMsg = d;
ERROR_CODE = ERROR_EXIT;
OnOpenVpnDisConnectionEvent();
}
}
else if (d.IndexOf("errno=", StringComparison.OrdinalIgnoreCase) > 0
|| d.IndexOf("error:2006D080", StringComparison.OrdinalIgnoreCase) >= 0
|| d.IndexOf("code=995", StringComparison.OrdinalIgnoreCase) >= 0
|| d.IndexOf("There are no TAP-Win32 adapters on this system", StringComparison.OrdinalIgnoreCase) >= 0
|| d.IndexOf("Error opening configuration file", StringComparison.OrdinalIgnoreCase) >= 0
|| (d.IndexOf("CreateIpForwardEntry: Access is denied.", StringComparison.OrdinalIgnoreCase) >= 0
&& d.IndexOf("[status=5 if_index=", StringComparison.OrdinalIgnoreCase) >= 0)
|| d.IndexOf("CreateFile failed on TAP device") >= 0 )
{
// Want to handle all and go for ReConnect, atmost possible
caughtExp = true;
connected = false;
errorMsg = d;
ERROR_CODE = ERROR_FATAL;
OnOpenVpnDisConnectionEvent();
}
return;
}
}
return;
}
private bool isInValidLine(string line)
{
if (line.IndexOf("errno=", StringComparison.OrdinalIgnoreCase) >= 0
|| line.IndexOf("error:2006D080", StringComparison.OrdinalIgnoreCase) >= 0
|| line.IndexOf("code=995", StringComparison.OrdinalIgnoreCase) >= 0
|| line.IndexOf("There are no TAP-Win32 adapters on this system", StringComparison.OrdinalIgnoreCase) >= 0
|| line.IndexOf("Error opening configuration file", StringComparison.OrdinalIgnoreCase) >= 0
|| line.IndexOf("Exiting") >= 0
|| line.IndexOf("The requested name is valid but does not have an IP address.") >= 0
|| line.IndexOf("CreateFile failed on TAP device") >= 0 // && (line.IndexOf("General failure (ERROR_GEN_FAILURE) (errno=31)") >= 0) )
)
{
return true;
}
return false;
}
为什么在该系统上需要这么多CPU?
非常感谢任何帮助。
答案 0 :(得分:3)
据猜测,25%是一个完整的核心,P4(更糟糕的是 - 更糟糕的是比较处理器的方式)是单线程的,所以它完全忙。
你的代码中有一个繁忙的循环(我怀疑),所以保持一个执行线程CPU一直处于忙碌状态。
在多核系统上,如果其他进程可用,其他进程将继续运行。
即使它在一个空的连接集上进行迭代,当你有这个紧密的循环时,CPU的使用仍将继续。要么睡一觉,要么不那么频繁地调用函数,要么正确地完成工作,然后进行选择或轮询,以便操作系统在你有数据时唤醒你
答案 1 :(得分:2)
它占用了执行线程中的所有可用CPU:单个内核几乎100%,4内核CPU占10%(执行它的内核的100%)。
正如@Douglas指出的那样,它可能是一个循环的结果,或者只是你的应用程序消耗的数据比它们的生产速度慢。
如果这是它的行为,那么它将使用所有可用的CPU时间。如果您不想使用所有CPU时间(因为它会降低系统速度或消耗太多电池),您可能会降低进程优先级。您无法设置System.Windows.Forms.Timer
对象的优先级(它具有进程的优先级)。问题是你真的必须经常调用这个函数吗?最小化时你不能禁用它吗?无论如何我在想:应用程序只消耗100%的一个核心用于化妆...我明白改变一些有效的东西很烦人...