【问题标题】:If Background Worker is a background thread how come I can executed this code?如果 Background Worker 是后台线程,我怎么能执行这段代码?
【发布时间】:2013-07-22 05:44:23
【问题描述】:

研究我发现Background Workerbackground 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

【问题讨论】:

    标签: vb.net multithreading backgroundworker background-thread


    【解决方案1】:

    Form1_Load 方法不是“主过程”,因此您在其末尾显示的消息框实际上是一个谎言。这只是Form.Load event 的事件处理方法,在您的表单首次显示时引发。

    “主过程”被命名为Main,并在一个单独的文件中定义(实际上,在 VB.NET 中,它是由编译器自动生成的,默认情况下您甚至看不到)。您可以在 Microsoft 的 VB Programming Guide 中找到有关 Main 方法的更多信息。

    只要您的程序仍在运行,Main 方法就会一直运行。在Form1_Load 事件处理方法完成后,Form1 仍然在屏幕上,很明显你的程序还没有关闭。而且由于您的程序的主线程仍在运行,BackgroundWorker 对象的后台线程仍在异步运行,就像您告诉它的那样。

    【讨论】:

    • 观看有关线程的视频以及控制台应用程序上的示例引起了混乱。我想现在的问题是为什么VB.Net表单应用程序中有前台和后台线程,如果最终,只要打开,应用程序都会执行线程。我能想到的唯一一件事是,无论用户是否关闭应用程序都需要完成某种功能,比如更新。
    • @Uriel 控制台应用程序的工作方式与 Windows 应用程序非常不同。在 Windows 应用程序(WinForms 或 WPF,无关紧要)中,“前台”线程是显示和管理用户界面并运行消息循环的线程]。事实上,它是唯一线程,您可以在其上与 UI 交互。您必须跳过箍(例如Control.Invoke 方法)才能从后台线程执行此操作。后台线程不会在应用程序关闭时运行(即前台线程退出)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多