同一个盒子上的进程间通信 - 2个应用程序或进程之间的通信

Posted

技术标签:

【中文标题】同一个盒子上的进程间通信 - 2个应用程序或进程之间的通信【英文标题】:Interprocess communication on the same box - communication between 2 applications or processes 【发布时间】:2014-01-13 21:00:05 【问题描述】:

在同一个盒子上的应用程序之间实现进程间通信的最佳方式是什么——都是用 c# 编写的?

管理器应用程序将向其他应用程序发送命令,例如:停止、启动。它还将监视应用程序并可能要求数据。

所有应用程序都将在同一台机器上运行 Windows 7 操作系统。

IPC 频道是一个不错的选择吗?命名管道是更好的选择吗?还是插座是更好的选择?

被管理的应用程序都具有相同的名称。当它们启动时,它们会加载一个确定运行哪些算法的 dll。

谢谢

【问题讨论】:

【参考方案1】:

固定下来,将 WCF 与命名管道一起使用。

这里有一个关于这个问题的链接:What is the best choice for .NET inter-process communication?

【讨论】:

【参考方案2】:

一种方法,特别是如果您想在从同一个应用程序中分离出来的不同进程之间进行通信 - 使用MemoryMappedFile。这是最简单的示例 - 将其放入控制台应用程序中。启动它的 2 个实例,然后快速连续地在一个中键入 w+enter,在另一个中键入 r+enter。手表。注意 – 我取消了读取和写入时间的同步,以便您可以看到有时数据会更改而其他时间 - 不是

class Program

    private static MemoryMappedFile _file = MemoryMappedFile.CreateOrOpen("XXX_YYY", 1, MemoryMappedFileAccess.ReadWrite);
    private static MemoryMappedViewAccessor _view = _file.CreateViewAccessor();

    static void Main(string[] args)
    
        askforinput:
        Console.WriteLine("R for read, W for write");
        string input = Console.ReadLine();

        if (string.Equals(input, "r", StringComparison.InvariantCultureIgnoreCase))
            StartReading();
        else if (string.Equals(input, "w", StringComparison.InvariantCultureIgnoreCase))
            StartWriting();
        else
            goto askforinput;


        _view.Dispose();
        _file.Dispose();   

    

    private static void StartReading()
    

        bool currVal = false;

        for (int i = 0; i < 100; i++)
        
            currVal = currVal != true;
            Console.WriteLine(_view.ReadBoolean(0));
            Thread.Sleep(221);
        
    

    private static void StartWriting()
    

        bool currVal = false;

        for (int i = 0; i < 100; i++)
        
            currVal = currVal != true;
            _view.Write(0, currVal);
            Console.WriteLine("Writen: " + currVal.ToString());
            Thread.Sleep(500);
        
    

同样,您可以使用内存映射文件构建非常复杂且强大的通信层。这只是一个简单的例子。

【讨论】:

以上是关于同一个盒子上的进程间通信 - 2个应用程序或进程之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信之-----信号量

多进程编程之进程间通信-管道和消息队列

day33多进程之进程间通信

linux c之通过管道实现兄弟间进程通信:

进程间通信

进程间通信之共享内存