Ожидание потока - Visual Basic .NET

Формулировка задачи:

Всем привет! Мужики, помогите сделать наиболее правильно. Суть такая. Есть основная форма. На основной форме кнопка. Нажимаем кнопку на основной форме, запускается процедура (Sub1) запускающая класс в потоке, который кое-что выполняет и вызывает ещё одну форму(Form2). Нужно ждать пока в Form2 не будет нажата кнопка, пока этого не произойдет, код основной формы после Sub1 выполнять нельзя. После нажатия кнопки в Form2 необходимо продолжить выполнение кода основной формы. Проблема вот в чем. Из главной формы через Sub1, класс вызывается в отдельном потоке, поэтому не дожидаясь завершения Sub1, начинает выполняться код, который идет ниже Sub1. Join() не подходит. Пробовал после Sub1 вставить бесконечный цикл while с флагом true или false, который меняется после нажатия на кнопку во второй форме, условно говоря такой вариант работает, но фризит первую форму, что не годится. Да и колхозный велосипед это. Какие есть ещё варианты? Схематично код выглядит так
Public Class Form1
 
    'Public flagExitWhile As Boolean
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'flagExitWhile = False
 
        Sub1() 'Запуск класса в отдельном потоке
 
        'Здесь нужно ждать...
 
        'Если вставить while, то получаем зависание.
        'While flagExitWhile = False
 
        'End While
 
 
        'Этот код нельзя выполнять, пока в Form2 вызванной из MyCls не будет нажата кнопка
        Dim b1, b2, b3 As Integer
            b1 = 100
            b2 = 100
            b3 = b1 + b2
    End Sub
 
 
    Public Sub Sub1()
        Dim cl As New MyCls
        'cl.run()
    End Sub
 
End Class
 
Public Class MyCls
    'Тут поток
    'Куча тяжелых процедур
    'Вызов Form2 с кнопкой, нажав на кнопку код после Sub1() на Form1 должен продолжиться
End Class
 
'Public Class Form2
'    'Тут кнопка и при нажатии flagExitWhile = true
'End Class

Код к задаче: «Ожидание потока - Visual Basic .NET»

textual
Public Class Form1
 
    Private Delegate Sub _runThread()
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim th As New _runThread(AddressOf Sub1) 'зпуск потока
        th.BeginInvoke(Nothing, Nothing)
    End Sub
 
    'вызывается из под дочернего потока после завршения работы
    Private Sub DoNext()
        Dim b1, b2, b3 As Integer
        b1 = 100
        b2 = 100
        b3 = b1 + b2
    End Sub
 
    Public Sub Sub1()
        Dim cl As New MyCls
        'cl.run()
 
        'MyCls должен вызывать форму при помощи  ShowDialog
        Me.Invoke(New MethodInvoker(AddressOf DoNext))
    End Sub
 
End Class
 
Public Class MyCls
    'Тут поток
    'Куча тяжелых процедур
    'Вызов Form2 с кнопкой, нажав на кнопку код после Sub1() на Form1 должен продолжиться
End Class
 
'Public Class Form2
 
'Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'    Me.DialogResult = Windows.Forms.DialogResult.OK
'End Sub
 
'End Class

8   голосов, оценка 3.625 из 5


СОХРАНИТЬ ССЫЛКУ