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