Дождитесь завершения операций с одним экземпляром, прежде чем перейти к следующей строке VB.NET

#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
  

В этом случае начальный экземпляр ничего не ожидает. Он просто продолжает и делает то, что делает, со своим собственным аргументом командной строки. Он понятия не имеет, будут ли какие-либо последующие экземпляры или, если есть, сколько их будет и когда они начнутся, поэтому он понятия не имел, чего он ждал. Каждый раз, когда запускается другой экземпляр, первоначальный экземпляр реагирует на это, используя предоставленный аргумент командной строки.