我正在编写一个程序,它使用匿名管道在软件套件中的不同进程之间进行通信。我们有一个主可执行文件(我们称之为“前端”),它打开了单独的可执行文件(“模块”),我正在编写的程序基本上将充当所有不同模块之间的中介,通过将序列化的消息从一个发送到另一个,根据发送的消息执行不同的操作。
我目前有两个后台工作人员,他们一直在监听从前端(打开一个模块)或模块(向另一个模块发送消息)发送的消息。
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()为止。有人对我如何提高效率有什么建议吗?
最佳答案
“循环实际上会挂在bf上。反序列化”你的意思是它们会阻塞。这是正常的,因为在从AnonymousPipeServerStream获取必要数据之前,反序列化不会完成。因此,它不应该消耗任何CPU周期。