我正在编写一个程序,使用匿名管道在我们软件套件内的不同进程之间进行通信。我们有一个主可执行文件(我们称之为“前端”),它打开单独的可执行文件(“模块”),而我正在编写的程序基本上将作为所有不同模块之间的中介,通过发送序列化消息从一个模块到另一个模块来执行基于发送的消息的不同操作。
我目前有两个后台工作线程,不断监听来自前端(以打开模块)或模块(向另一个模块发送消息)发送的消息。
我目前有两个后台工作线程,不断监听来自前端(以打开模块)或模块(向另一个模块发送消息)发送的消息。
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()被调用。有没有人有什么建议可以让这个过程变得更加高效?
Deserialize
时,如果没有消息,它是否会阻塞或立即返回null
?发送更多消息时,CPU使用情况是否会改变?没有消息时,它是否保持运行状态?它应该是阻塞的,但是...您是否尝试过一些分析工具来找出代码花费时间的地方? - Luaan