#vb.net #multiple-instances
#vb.net #несколько экземпляров
Вопрос:
В настоящее время я использую «создать единый экземпляр приложения» (событие MyApplication_StartupNextInstance) в VB (win forms .net framework) для передачи аргументов командной строки из нескольких экземпляров в основную форму. Я добавляю это в список строк, а затем передаю этот список следующей функции / подразделу. Список фиксирует все аргументы, если я добавляю окно сообщения непосредственно перед вызовом следующей функции, но затем, когда нет msgbox, фиксируются не все аргументы.
Я устал использовать таймеры / задержки, которые являются попаданием и промахом. Пробовал использовать timed msgbox, который отключается через пару секунд, что то же самое. Как я могу заставить его подождать, пока все экземпляры не будут запущены, а затем перейти к следующей строке кода?
'ApplicationEvents.vb
Private Sub MyApplication_StartupNextInstance(sender As Object, e As ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
Dim f = Application.MainForm
If f.GetType Is GetType(my_app_name) Then
CType(f, my_app_name).NewArgumentsReceived(e.CommandLine(0))
End If
End Sub
'my app has the below codes
Public Sub NewArgumentsReceived(args As String)
mylist.Add(args)
End Sub
Private Sub SomeForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
mylist.Add(arg) 'arg is for main form 'args' is for instances
'this is where I want to wait until all the other instances have completed
Anotherfunction(mylist)
End Sub
Комментарии:
1. То, о чем вы просите, на самом деле не имеет смысла. Начальный экземпляр ничего не знает о последующих экземплярах, пока они не подключатся к нему, так как же он должен знать, когда больше нет подключаемых экземпляров? Это
StartupNextInstance
событие может быть вызвано в любое время, поэтому должен ли начальный экземпляр ждать вечно, на случай, если запустится другой экземпляр?2. В принципе, вам следует реструктурировать свой код так, чтобы основная форма могла получать аргументы командной строки из нового экземпляра в любое время. Например, предположим, что основная форма была родительской MDI и открывала текстовые файлы в дочерних формах. Если начальный экземпляр получил путь к файлу в качестве аргумента, то он откроет одну дочернюю форму, содержащую этот файл. Каждый раз, когда вызывалось
StartupNextInstance
событие, вы открывали новую дочернюю форму в начальном экземпляре для файла, предоставленного в качестве аргумента. Что одна новая дочерняя форма должна быть открыта в любое время.
Ответ №1:
Как я упоминал в своих комментариях, StartupNextInstance
событие может быть вызвано в любое время, поэтому вы должны спроектировать свое приложение так, чтобы оно реагировало на него в любое время. Начальный экземпляр понятия не имеет, сколько будет последующих экземпляров или когда они начнутся, поэтому он должен просто реагировать на них по одному, когда бы они ни происходили. Вот пример приложения с одним экземпляром, в котором основной формой является родительский MDI, а аргументами командной строки являются пути к текстовым файлам, каждый из которых открывается в дочернем окне.
Дочерняя форма:
Imports System.IO
Public Class ChildForm
Public Property FilePath As String
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox1.Text = File.ReadAllText(FilePath)
End Sub
End Class
Родительская форма:
Public Class ParentForm
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim args = Environment.GetCommandLineArgs()
If args.Length > 1 Then
LoadChildForm(args(1))
End If
End Sub
Public Sub LoadChildForm(filePath As String)
Dim child As New ChildForm With {.MdiParent = Me,
.FilePath = filePath}
child.Show()
End Sub
End Class
События приложения:
Imports Microsoft.VisualBasic.ApplicationServices
Namespace My
' The following events are available for MyApplication:
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Sub MyApplication_StartupNextInstance(sender As Object, e As StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
Dim args = e.CommandLine
If args.Count > 0 Then
DirectCast(MainForm, ParentForm).LoadChildForm(args(0))
End If
End Sub
End Class
End Namespace
В этом случае начальный экземпляр ничего не ожидает. Он просто продолжает и делает то, что делает, со своим собственным аргументом командной строки. Он понятия не имеет, будут ли какие-либо последующие экземпляры или, если есть, сколько их будет и когда они начнутся, поэтому он понятия не имел, чего он ждал. Каждый раз, когда запускается другой экземпляр, первоначальный экземпляр реагирует на это, используя предоставленный аргумент командной строки.