我正在编写一个程序,它使用匿名管道在软件套件中的不同进程之间进行通信。我们有一个主可执行文件(我们称之为“前端”),它打开了单独的可执行文件(“模块”),我正在编写的程序基本上将充当所有不同模块之间的中介,通过将序列化的消息从一个发送到另一个,根据发送的消息执行不同的操作。
我目前有两个后台工作人员,他们一直在监听从前端(打开一个模块)或模块(向另一个模块发送消息)发送的消息。

    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周期。

07-25 20:13