#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