如何在后台工作线程中使用匿名管道来降低程序的CPU使用率?

4
我正在编写一个程序,使用匿名管道在我们软件套件内的不同进程之间进行通信。我们有一个主可执行文件(我们称之为“前端”),它打开单独的可执行文件(“模块”),而我正在编写的程序基本上将作为所有不同模块之间的中介,通过发送序列化消息从一个模块到另一个模块来执行基于发送的消息的不同操作。
我目前有两个后台工作线程,不断监听来自前端(以打开模块)或模块(向另一个模块发送消息)发送的消息。
    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
如果在循环中抛出了大量的异常,有什么机会吗? - g.pickardou
@Luaan 1) 是的,它肯定会在Deserialize调用上阻塞 2) 当我发送更多消息时,CPU使用率的变化微不足道 3) 是的,无论是否有消息,它始终保持在15%左右 4) 不,我尝试过使用分析器 - 我没有太多(如果有的话)使用经验。 - soccercta100
@g.pickardou 不,没有抛出异常。只是在 Deserialize() 调用处阻塞。 - soccercta100
如果反序列化出现阻塞,则您的应用程序中必须有其他东西增加了使用量。还有其他while循环和/或定时器在运行吗? - Idle_Mind
1个回答

3
“the loops actually get hung up on the bf.Deserialize” 的意思是它们被阻塞了。这是正常的,因为Deserialize在从AnonymousPipeServerStream获取必要数据之前不会完成。因此,它不应该消耗任何CPU周期。

所以你的意思是我的CPU使用率被其他东西驱动了?编辑事实上就是这种情况——我找到了问题出现的地方并解决了它。谢谢! - soccercta100
那个罪魁祸首是谁? - Idle_Mind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接