如何减少 CPU 在后台工作程序中使用匿名管道的程序的使用?
How can I reduce the CPU usage of a program using Anonymous Pipes in a background worker?
我正在编写一个程序,它使用匿名管道在我们软件套件中的不同进程之间进行通信。我们有一个主要的可执行文件(我们称之为 "Front End"),它打开了单独的可执行文件("Modules"),而我正在编写的程序基本上将充当所有不同的可执行文件之间的中介模块通过将序列化消息从一个发送到另一个来根据发送的消息执行不同的操作。
我目前有 2 个后台工作人员不断监听从前端(打开模块)或模块(向另一个模块发送消息)发送的消息
private void bwModuleListener_DoWork(object sender, DoWorkEventArgs e)
{
ProcessMessage Message = null;
AnonymousPipeServerStream ModuleReceiver = (AnonymousPipeServerStream)e.Argument;
BinaryFormatter bf = new BinaryFormatter();
while (true)
{
Message = (ProcessMessage)bf.Deserialize(ModuleReceiver);
if (Message != null)
{
bwModuleListener.ReportProgress(0, Message);
Message = null;
}
}
}
private void bwFrontEndListener_DoWork(object sender, DoWorkEventArgs e)
{
ProcessMessage Message = null;
AnonymousPipeClientStream FrontEndReceiver = (AnonymousPipeClientStream)e.Argument;
BinaryFormatter bf = new BinaryFormatter();
while (true)
{
Message = (ProcessMessage)bf.Deserialize(FrontEndReceiver);
if (Message != null)
{
bwFrontEndListener.ReportProgress(0, Message);
Message = null;
}
}
}
这个问题是后台工作人员占用了相当多的 CPU(在我的四核 3.4GHz 机器上一直是 15%)。我试过让线程休眠以减慢循环迭代,但循环实际上挂在 bf.Deserialize() 调用上,直到从管道的另一端调用关联的 bf.Serialize() 。有人对我如何提高效率有任何建议吗?
"the loops actually get hung up on the bf.Deserialize" 你的意思是他们阻止了。这是正常的,因为反序列化在从 AnonymousPipeServerStream 获取必要数据之前不会完成。因此它不应该消耗任何 CPU 周期。
我正在编写一个程序,它使用匿名管道在我们软件套件中的不同进程之间进行通信。我们有一个主要的可执行文件(我们称之为 "Front End"),它打开了单独的可执行文件("Modules"),而我正在编写的程序基本上将充当所有不同的可执行文件之间的中介模块通过将序列化消息从一个发送到另一个来根据发送的消息执行不同的操作。
我目前有 2 个后台工作人员不断监听从前端(打开模块)或模块(向另一个模块发送消息)发送的消息
private void bwModuleListener_DoWork(object sender, DoWorkEventArgs e)
{
ProcessMessage Message = null;
AnonymousPipeServerStream ModuleReceiver = (AnonymousPipeServerStream)e.Argument;
BinaryFormatter bf = new BinaryFormatter();
while (true)
{
Message = (ProcessMessage)bf.Deserialize(ModuleReceiver);
if (Message != null)
{
bwModuleListener.ReportProgress(0, Message);
Message = null;
}
}
}
private void bwFrontEndListener_DoWork(object sender, DoWorkEventArgs e)
{
ProcessMessage Message = null;
AnonymousPipeClientStream FrontEndReceiver = (AnonymousPipeClientStream)e.Argument;
BinaryFormatter bf = new BinaryFormatter();
while (true)
{
Message = (ProcessMessage)bf.Deserialize(FrontEndReceiver);
if (Message != null)
{
bwFrontEndListener.ReportProgress(0, Message);
Message = null;
}
}
}
这个问题是后台工作人员占用了相当多的 CPU(在我的四核 3.4GHz 机器上一直是 15%)。我试过让线程休眠以减慢循环迭代,但循环实际上挂在 bf.Deserialize() 调用上,直到从管道的另一端调用关联的 bf.Serialize() 。有人对我如何提高效率有任何建议吗?
"the loops actually get hung up on the bf.Deserialize" 你的意思是他们阻止了。这是正常的,因为反序列化在从 AnonymousPipeServerStream 获取必要数据之前不会完成。因此它不应该消耗任何 CPU 周期。