与VB.NET中的背景工作者的选框进度栏

时间:2015-02-20 10:06:27

标签: vb.net multithreading progress-bar

我有一个主窗体,底部状态条带有一个进度条。它设置为大帐篷风格。我想让它在什么时候保持动画效果 我运行了很长的功能。但是当函数命中时,表单及其上的所有内容都会冻结,因此II使用了后台工作程序 运行长功能。但是这在MyClass.BigFunction()代码中给了我以下错误。

跨线程操作无效:控制'frmMainNew'从其创建的线程以外的线程访问。

“frmMainNew”是进度条和后台工作者的主要形式。我将表单作为参数传递给MyClass对象 当我初始化它时。

这是我第一次使用backgroundworker,我还需要什么? 我已经看过这些例子并尝试过,但没有任何效果。 (123456)。

我也必须将此用于其他功能。

我的代码:

   Private WithEvents bgw As BackgroundWorker

Private Sub frmMainNew_Load(ByVal sender As Object,ByVal e As System.EventArgs)处理Me.Load

    Try
        Me.SuspendLayout()

    'Other Functions

        w_AddBackgroundWorkerForProgressBar()

        Me.ResumeLayout()

    Catch ex As Exception
        Scube.Planner.ErrorHandler.DisplayError(ex)
    End Try

End Sub

Private Sub w_AddBackgroundWorkerForProgressBar()
    bgw = New BackgroundWorker
    AddHandler bgw.DoWork, AddressOf bgw_DoWork
    AddHandler bgw.RunWorkerCompleted, AddressOf bgw_Completed
    'AddHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged
End Sub

Private Sub MyButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton.Click
    Try

        bgw.WorkerSupportsCancellation = True
        bgw.RunWorkerAsync()
        'MyClass.BigFunction()   <--- Originally called from here
    Catch ex As Exception
        Scube.Planner.ErrorHandler.DisplayError(ex)
    Finally
        Me.Cursor = Cursors.Default
    End Try
End Sub

Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgw.DoWork
    'Do your lenghty operations here

    MyClass.BigFunction()

    System.Threading.Thread.Sleep(10000)

End Sub

Private Sub bgw_Completed(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
    If Not IsNothing(e.Error) Then
        MessageBoxEx.Show(e.Error.ToString)
    End If
    ProgressBar1.Hide()
End Sub

Private Sub w_ShowProgressBar()
    ProgressBar1.Show()
    Me.Refresh()
    System.Windows.Forms.Application.DoEvents()
End Sub

1 个答案:

答案 0 :(得分:0)

你不能也不应该从你的BigFunction()&#39;访问你的frmMainNew。它正在处理一个单独的线程,并且无法访问UI线程。我们需要看看你在你的大功能中做了什么来告诉你这个问题。我会猜测并说你正试图从该函数中更新进度条值?如果是这样,那么这是不正确的方法。

您需要做的是,在BigFunction中设置进度,如下所示:

bgw.ReportProgress(Progress/Percentage)

并且有一个更改进度的事件,并且该事件的内部是您更新进度条的位置。

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
  Progressbar1.value = e.ProgressPercentage
End Sub