1

研究我發現Background Worker是一個background thread,但是當我運行下面的代碼Background Worker仍然運行,直到結束,即使當主程序退出。這個功能保留到foreground threads嗎?如果Background Worker是一個後臺線程,我該如何執行此代碼?

代碼:

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中,它由編譯器自動生成,默認情況下對您甚至不可見)。您可以在Microsoft的VB Programming Guide中找到有關Main方法的更多信息。如果程序仍在運行,Main方法仍在運行。 Form1_Load事件處理程序方法結束後,Form1仍然在屏幕上,很明顯,您的程序尚未關閉。由於程序的主線程仍在運行,BackgroundWorker對象的後臺線程仍然異步運行,就像您告訴的那樣。

+0

從在控制檯應用程序中使用示例觀看線程上的視頻而引發的混淆。我想現在的問題是爲什麼在VB.Net窗體應用程序中存在前臺和後臺線程,如果最終只要打開,應用程序將以任一方式執行線程。我唯一能想到的是如果做某種功能需要完成是否用戶關閉應用程序,如更新。 –

+0

@Uriel控制檯應用程序與Windows應用程序的工作方式非常不同。在Windows應用程序(WinForms或WPF,無所謂)中,「前臺」線程是顯示和管理用戶界面並運行消息循環的那個線程。實際上,它是可以與UI進行交互的* only *線程。你必須通過後臺線程(例如'Control.Invoke'方法)來做到這一點。後臺線程*在應用程序關閉時不會運行(即前臺線程退出)。 –

相關問題