C#在没有确认的情况下将一位信息(=布尔值)发送到另一个进程

Posted

技术标签:

【中文标题】C#在没有确认的情况下将一位信息(=布尔值)发送到另一个进程【英文标题】:C# Sending one bit of information (= boolean) to another process without acknowledgement 【发布时间】:2019-11-25 15:20:42 【问题描述】:

我目前有两个进程,我想将布尔值从一个进程转移到另一个进程,例如用户在某个对话框中按下了确定。但我不能/不想等待其他进程接收信息,我不知道其他进程是否或何时会收到消息。

先决条件:

两个进程(应用程序)都是用 C# 编写的 两个进程都知道另一个进程存在 两个进程都知道某个字符串/关键字,可用于识别另一个进程 传输是单向的,Process1总是向Process2发送数据 Process1 和 Process2 在同一台 Windows 机器上,并且只存在一个 Process1 始终在线,Process2 可能已关闭

目前的选择:

MemoryMappedFile(在内存中) MemoryMappedFile(作为文件) Named pipes WCF 好旧文件(实际上并不总是那么好) 剪贴板(是的,有些人会这样做)

有些选项是有效的,但我认为大多数选项对于这种情况来说都是矫枉过正。另一个问题是何时删除信息(何时清理文件或管道)。

也许我可以写入某种缓存?

你有什么想法吗?

PS:如果您发布技术,请同时提供一段代码。

【问题讨论】:

【参考方案1】:

最后我们用EventWaitHandle

进程1

handle = new EventWaitHandle(false, EventResetMode.ManualReset, "KEYWORD");

if(secretHappened)

    handle.Set();

进程2

using(var handle = EventWaitHandle.OpenExisting("KEYWORD")) //this always happens after Process1 so we can assume that the handle exists

    if(handle.WaitOne(0))
    
        //Do your secret stuff
    

到目前为止,它运行良好,唯一的问题是来自 Process1 的句柄不能被 GC 清理,并且很难确定何时处理句柄。我们将句柄的生命周期与 Process2 的生命周期相结合,一旦 Process2 不再存在,我们就会处理该句柄。这可能需要一段时间,但这就是我们所做的。由于我们不知道是否在 Process2 中使用了句柄,因此我们不能将其用作清理内容的指示符。

【讨论】:

以上是关于C#在没有确认的情况下将一位信息(=布尔值)发送到另一个进程的主要内容,如果未能解决你的问题,请参考以下文章

在不使用分析服务的情况下将一组具有离散和连续数据值的数据分成两组?

C#如何在不知道新数组长度的情况下将数组中的值保存到新数组中

是否可以在没有真实设备的情况下将其应用 TVOS 发送到 iTunes 连接?

c#在不退出子线程的情况下将值从子线程传递给父线程

如何在不重新初始化当前帧内容的情况下将一帧的内容加载到另一帧

在没有 Azure 的情况下将原始数据发送到 Windows 商店应用程序