Простейший способ передачи флага между двумя отдельными процессами .net

#vb.net #ipc

#vb.net #ipc

Вопрос:

У меня есть два отдельных vb.net приложения. Один из них представляет собой интерфейс WinForm с графическим интерфейсом, а другой — консольное приложение, которое обрабатывает передачу файлов и работает в фоновом режиме. Приложение для передачи файлов отслеживает каталог и при обнаружении новых файлов передает файлы в пункт назначения. Он проверяет, доступен ли удаленный адресат. Я хотел бы иметь флаг, который указывает, что задача передачи файлов может подключаться к удаленному получателю и отображать этот статус в графическом интерфейсе.

Пример того, как приложение с графическим интерфейсом запускает консольное приложение для передачи файлов:

 Public FileXferProcess As Process
Dim startInfo As New ProcessStartInfo("FileXfer.exe")
startInfo.CreateNoWindow = True
startInfo.UseShellExecute = False
FileXferProcess = Process.Start(startInfo)
 

Я знаю, что существует много разных типов методов межпроцессного взаимодействия, но я ищу самое простое решение для совместного использования логического состояния.

Комментарии:

1. Пожалуйста, предоставьте больше контекста. Запускает ли приложение с графическим интерфейсом сам процесс передачи файлов? Или он должен подключаться к уже запущенной задаче?

2. Является ли «другой» VB.NET применение службы Windows?

3. @paulroho Запускаю процесс передачи файлов из приложения с графическим интерфейсом с помощью ‘Process. Начать’.

4. @AndrewMorton консольное приложение, которое запускается без окна

5. Поскольку вы запускаете консольное приложение, выдает ли оно какие-либо выходные данные, которые вы можете использовать для отслеживания статуса передачи? Если да, может быть, вы можете перенаправить output ( startInfo.RedirectStandardOutput = True ) и обработать FileXferProcess.OutputDataReceived событие для захвата выходных данных?

Ответ №1:

В итоге я использовал мьютекс для передачи флага между отдельными процессами. Это не требует каких-либо накладных расходов и обрабатывает, если процесс внезапно закрывается (поскольку мьютекс будет уничтожен вместе с задачей, которая его создала).

Ниже приведены фрагменты кода:

В задаче передачи файлов

 Public hMutex_Connected As Mutex
...

' If connected, set mutex
hMutex_Connected = New Mutex(True, "FileXfer_Connected")
...

' If disconnected, destroy mutex
hMutex_Connected.Close()
 

В графическом интерфейсе основного приложения

 Public Function IsConnected() As Boolean
  Dim bConnected As Boolean = False
  Try
     Mutex.OpenExisting("FileXfer_Connected")
     bConnected = True
  Catch ex As WaitHandleCannotBeOpenedException
     ' "Mutex does not exist."
  Catch ex As UnauthorizedAccessException
     ' "Unauthorized access: " amp; ex.Message
  Catch ex As Exception
     ' ex.ToString
  End Try

  Return bConnected
End Function