关于C#:事件可以是进程间的吗?

Can Events be Inter-Process?

我已经在一个进程中创建了一个事件并进行测试,然后通过管道将事件句柄发送到一个完全独立的进程(而不是子线程)。

当我第一次触发该事件时,WaitForSingleObject不会检测到该事件,因此我猜答案是否定的,除非我错过了SECURITY_ATTRIBUTES结构中的某些技巧?

或者也许我需要使用命名事件并调用OpenEvent()?

在这种情况下,我无法使用窗口消息,因为我试图向Windows服务发出信号。我可以使用管道,但是会有许多这样的应用程序,如果可能的话,我想找到一个"低成本"的解决方案。

诸如内存映射文件之类的其他选项比管道具有更多的开销吗?

您将如何做?


您需要创建一个命名事件并在两个进程中都将其打开。如果您有多个进程正在监听,则可以考虑使用信号量。


是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  #COMPILE EXE"NamedEvent.exe"

  #INCLUDE"win32api.inc"

  %EVENT_ALL_ACCESS = &h0001F0003

  FUNCTION PBMAIN() AS LONG  

    LOCAL lRet AS LONG, lError AS LONG, lEventName AS ASCIIZ * %MAX_PATH
    lEventName ="TestEvent"
    lRet   = CreateEvent (BYVAL %NULL, %False, %False, lEventName)
    lError = GetLastError ()
    IF ISFALSE lRet THEN
      MSGBOX"Unable to create Event, error:" + STR$(lError),,"CreateEvent error"
    ELSE
      IF lError = %ERROR_ALREADY_EXISTS THEN
        lRet = OpenEvent(BYVAL %EVENT_ALL_ACCESS, %False, lEventName)
        lError = GetLastError()
        IF lRet THEN
          MSGBOX"Opened existing Event, handle:" + STR$(lRet),,"OpenEvent:"
        ELSE
          MSGBOX"Unable to open Event, error:" + STR$(lError),,"OpenEvent error" : EXIT FUNCTION
        END IF
      ELSE
        MSGBOX"Created new Event, handle:" + STR$(lRet),,"CreateEvent:"
      END IF
    END IF    

  END FUNCTION

通常,开销较低的是:

管道(假设指定为小尺寸)

MemMapFiles

事件