【问题标题】:BackgroundWorker change label multithread VB.NETBackgroundWorker 更改标签多线程 VB.NET
【发布时间】:2017-05-04 09:53:54
【问题描述】:

我是多线程和后台工作者的新手。 我试图根据教程和论坛主题编写一个简单的测试,但它没有按我的预期工作。

我有一个带有Button1Label1BackgroundWorker1 控件的 Windows 窗体应用程序。

当我点击按钮时,我想这样做:

  • Backgroundworker 持续检查变量 state True 或 False
  • 首先将标签文本更改为 False(第一次状态 = false)
  • 如果state在主线程中设置为True,则将标签文本更改为True(当“Sample process”(For Next)结束时state设置为True)

我的代码是:

Public state As Boolean
Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Debug.Print("Button1_Click ThreadID - " & Thread.CurrentThread.ManagedThreadId)
    state = False

    BackgroundWorker1.RunWorkerAsync()

    '--Sample process in the main thread
    For c = 0 To 10000
        Debug.Print(c)
    Next

    state = True

End Sub


Dim c As Integer
Public Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork


    setlabel(state.ToString)

    Do While state = False
        Debug.Print("BackgroundWorker1_DoWork ThreadID - " & Thread.CurrentThread.ManagedThreadId & " - state: " & state)
        Thread.Sleep(100)
    Loop

    setlabel(state.ToString)
End Sub

Public Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Debug.Print("BackgroundWorker1_RunWorkerCompleted - State: " & state)

End Sub

Sub setlabel(text As String)
    Label1.Invoke(Sub()
                      Label1.Text = text
                  End Sub)
End Sub

我的问题是:

  • 标签的文本在开头不会更改为 False BackgroundWorker1_DoWork
  • Do While 中没有Debug.Print

输出是:

Button1_Click ThreadID - 9
0
1
2
...
9998
9999
10000
BackgroundWorker1_RunWorkerCompleted - State: True

我做错了什么?

【问题讨论】:

    标签: vb.net multithreading backgroundworker


    【解决方案1】:

    您正在使用For 循环来绑定 UI 线程:

    For c = 0 To 10000
        Debug.Print(c)
    Next
    

    您需要让 UI 线程空闲,以便调用 setlabel(state.ToString) 才能真正更新 UI。

    因此,您需要让计时器(甚至是第二个后台工作人员)之类的东西等待一段时间,然后再设置state = True

    【讨论】:

    • 感谢您的评论,但对于我的菜鸟问题感到抱歉,我必须在哪里以及如何放置第二个 Backgroundworker?
    • Aaaa.. 我根据您的评论想通了!
    • 我在第一个后台工作人员之后创建了第二个后台工作人员。将 For 放在第二个 BackgroundWorker 的 DoWork 旁边。把 state = True 放到第二个 BackgroundWorker 的 RunWorkerCompleted 中。它有效! :) 谢谢你
    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2011-12-26
    • 2021-03-27
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多