1

Исследование Я узнал, что Background Worker является background thread, однако при запуске следующего кода Background Worker все еще работает до конца, даже когда основная процедура завершена. Разве эта функция не зарезервирована для foreground threads?Если фоновый рабочий стол - фоновый поток, то как я могу выполнить этот код?

Код:

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     'Run background worker 
     BackgroundWorker1.RunWorkerAsync() 
     'Display exit message 
     MsgBox("Main procedure exited") 
    End Sub 

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
     'Wait 10 seconds 
     Threading.Thread.Sleep(10000) 
     'Modify some numbers 
     Dim variable = 3 
     variable -= 1 
     'Display exit message 
     MsgBox("Background thread " & variable & " exited") 
    End Sub 
End Class 

ответ

2

Метод Form1_Load не «главная процедура», поэтому окно с сообщением, что вы показываете в конце этого на самом деле ложь. Это всего лишь метод обработчика событий для Form.Load event, поднятый, когда ваша форма отображается в первый раз.

«Основная процедура» имеет имя Main и определяется в отдельном файле (фактически, в VB.NET, он автоматически генерируется компилятором и даже не отображается вам по умолчанию). Дополнительную информацию о методе Main вы найдете в Microsoft VB Programming Guide.

Метод Main все еще работает, пока ваша программа все еще работает. После завершения метода обработчика Form1_LoadForm1 все еще находится на экране, поэтому ваша программа еще не закрыта. И так как основной поток вашей программы все еще запущен, фоновый поток объекта BackgroundWorker по-прежнему работает асинхронно, как и вы сказали.

+0

Путаница поднялась от просмотра видео по темам с примерами на консольном приложении. Думаю, теперь вопрос в том, почему в приложениях формы VB.Net есть фоновые и фоновые потоки, если в конце до тех пор, пока открыто, приложение будет выполнять поток в любом случае. Единственное, о чем я могу думать, - это выполнить какую-то функцию, которая должна быть завершена, если пользователь закрывает приложение или нет, например обновление. –

+0

Приложения @Uriel Console работают совсем по-другому, чем приложения Windows. В приложении Windows (WinForms или WPF не имеет значения) поток «переднего плана» - это тот, который отображает и управляет пользовательским интерфейсом и запускает цикл сообщений]. Фактически, это * единственный * поток, с которым вы можете взаимодействовать с пользовательским интерфейсом. Вы должны прыгать через обручи (например, метод 'Control.Invoke'), чтобы сделать это из фонового потока. Фоновые темы * не будут запускаться при закрытии приложения (т. Е. Выходящий поток переднего плана). –

 Смежные вопросы

  • Нет связанных вопросов^_^