Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何降低后台工作程序中使用匿名管道的程序的CPU使用率?_C#_Multithreading_Io_Pipe - Fatal编程技术网

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

C# 如何降低后台工作程序中使用匿名管道的程序的CPU使用率?,c#,multithreading,io,pipe,C#,Multithreading,Io,Pipe,我正在编写一个程序,它使用匿名管道在我们的软件套件中的不同进程之间进行通信。我们有一个主可执行文件(我们称之为“前端”),它打开单独的可执行文件(“模块”),我正在编写的程序基本上将充当所有不同模块之间的中介,通过从一个模块向另一个模块发送序列化消息,根据发送的消息执行不同的操作 我目前有两名后台工作人员,他们不断监听前端(打开模块)或模块(向另一个模块发送消息)发送的消息 问题是后台工作人员占用了相当大的CPU(在我的四核3.4GHz机器上始终占15%)。我曾尝试休眠线程以降低循环迭代的速度,

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

我目前有两名后台工作人员,他们不断监听前端(打开模块)或模块(向另一个模块发送消息)发送的消息


问题是后台工作人员占用了相当大的CPU(在我的四核3.4GHz机器上始终占15%)。我曾尝试休眠线程以降低循环迭代的速度,但实际上循环在bf.Deserialize()调用时会挂起,直到从管道的另一端调用关联的bf.Serialize()为止。有人对我如何提高效率有什么建议吗?

“循环实际上挂起在bf上。反序列化”你的意思是它们阻塞了。这是正常的,因为在从AnonymousPipeServerStream获取必要的数据之前,反序列化不会完成。因此,它不应该占用任何CPU周期。

当您调用它并且没有消息时,
反序列化
调用实际上是阻塞的,还是立即返回
null
?当您发送更多消息时,CPU使用情况是否会发生变化?当没有消息时,它会保持不动吗?它真的应该阻塞,但是。。。您是否尝试过一些探查器来找出代码在哪里花费时间?如果在循环中抛出无数异常,是否有可能?@Luaan 1)是的,它确实阻止了反序列化调用2)每当我发送更多消息时,CPU使用率的变化可以忽略不计3)是的,无论是否有消息,CPU使用率始终保持在15%左右4)没有,我尝试过使用探查器——我没有太多(如果有的话)经验them@g.pickardou不,不是抛出异常。只是在Deserialize()调用时阻塞。如果Deserialize阻塞,那么你的应用程序中必须有其他东西提高使用率。还有其他的while循环和/或计时器在运行吗?那么你是说我的CPU使用是由其他因素驱动的?编辑实际上就是这样——我找到了问题发生的地方并解决了它。谢谢罪犯是谁?
    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;
            }
        }
    }