У меня есть приложение vb.net, для которого я не использую среду приложения:
![enter image description here](https://i.stack.imgur.com/d78Zo.png)
Это приложение имеет следующие основные:
Imports System.Threading
Module Main
Private _sharedThing As SharedThing = New SharedThing()
Private _appRunner As AppRunner = New AppRunner()
Private _firstForm As Form
Private _secondForm As SecondParent
Public Event CloseApplication()
Sub StartFirstParent()
Dim firstForm = New Form1(_sharedThing, _appRunner, _secondForm)
Application.Run(firstForm)
End Sub
Sub Main()
Dim mainForm As New Form1(_sharedThing, _appRunner, _secondForm)
Application.Run(mainForm)
Application.Exit()
End Sub
End Module
Как видите, я вызываю Application.Run для одной формы и, используя кнопку, создаю другую форму, форму SecondParent.Таким образом, у меня есть две родительские формы.Вот код для Form1:
Imports System.Threading
Public Class Form1
Private _sharedThing As SharedThing
Private _appRunner As AppRunner
Public Event CloseApplication()
Private _otherParentForm As SecondParent
Public Sub New(aSharedThing As SharedThing, ByRef appRunner As AppRunner, otherParentForm As SecondParent)
_otherParentForm = otherParentForm
_sharedThing = aSharedThing
_appRunner = appRunner
_otherParentForm = otherParentForm
Me.IsMdiContainer = True
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
_sharedThing.SetString("First Parent: Form1")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
_sharedThing.ShowString()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Me.Close()
End Sub
Private Sub CreateSecondParent(sender As Object, e As EventArgs) Handles Button4.Click
Dim SecondThread As New Thread(New ThreadStart(AddressOf StartSecondParent))
SecondThread.Start()
End Sub
Sub StartSecondParent()
Dim secondForm As Form = New SecondParent(_sharedThing, Me)
Application.Run(secondForm)
End Sub
End Class
Вот конструктор для SecondParent:
Public Class SecondParent
Private _sharedThing As SharedThing
Private WithEvents _myParent As Form1
Public Sub New(ByRef aSharedThing As SharedThing, ByRef myParentForm As Form1)
_myParent = myParentForm
_sharedThing = aSharedThing
Me.IsMdiContainer = True
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
End Sub
Я не могу найти способ закрыть форму SecondParent при выходе из формы Form1.
Как видите, в основном я вызываю Application.Exit ().Я хочу избежать этого или понять его последствия.Пожалуйста, поймите, что почти все способы написания кода - это ограничение, с которым мне приходится мириться, поэтому любые предложения по полному изменению структуры бесполезны.Если неясно, если я не использую Application.Exit (), новые созданные формы не закрываются при закрытии основной формы.
Я не могу использовать обработчики событий, потому что яполучить ошибку.Предположим, я вставил это в свой код в SecondParent:
Public Sub KillSwitch_Sensor() Handles _myParent.CloseApplication
Me.Close()
End Sub
Я получаю сообщение об ошибке:
: 'Cross-thread operation not valid: Control 'SecondParent' accessed
from a thread other than the thread it was created on.'