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

В настоящее время я использую «сделать один экземпляр приложения» (событие MyApplication_StartupNextInstance) в VB (формы выигрыша .net framework) для передачи аргументов командной строки из нескольких экземпляров в основную форму. Я добавляю это в список строк, а затем передаю этот список следующей функции/подпрограмме. Список захватывает все аргументы, если я добавляю окно сообщения непосредственно перед вызовом следующей функции, но затем, когда нет msgbox, не все аргументы захватываются.

Я устал использовать таймеры/задержки, что является хитом и промахом. Пробовал использовать синхронизированный 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



person croverpfi    schedule 04.09.2020    source источник
comment
То, о чем вы просите, на самом деле не имеет смысла. Начальный экземпляр ничего не знает о последующих экземплярах, пока они не подключатся к нему, так как же он должен знать, когда больше нет экземпляров для подключения? Это событие StartupNextInstance может быть вызвано в любое время, поэтому должен ли первоначальный экземпляр ждать вечно, на случай, если запустится другой экземпляр?   -  person jmcilhinney    schedule 04.09.2020
comment
По сути, вы должны реструктурировать свой код, чтобы основная форма могла в любое время получать аргументы командной строки из нового экземпляра. Например, предположим, что основная форма была родителем MDI и открывала текстовые файлы в дочерних формах. Если первоначальный экземпляр получил путь к файлу в качестве аргумента, он открыл бы одну дочернюю форму, содержащую этот файл. Каждый раз, когда возникало событие StartupNextInstance, вы открывали новую дочернюю форму в начальном экземпляре для файла, предоставленного в качестве аргумента. Эта новая дочерняя форма должна быть открыта в любое время.   -  person jmcilhinney    schedule 04.09.2020


Ответы (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

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

person jmcilhinney    schedule 04.09.2020