我有一个主窗体,底部状态条带有一个进度条。它设置为大帐篷风格。我想让它在什么时候保持动画效果 我运行了很长的功能。但是当函数命中时,表单及其上的所有内容都会冻结,因此II使用了后台工作程序 运行长功能。但是这在MyClass.BigFunction()代码中给了我以下错误。
跨线程操作无效:控制'frmMainNew'从其创建的线程以外的线程访问。
“frmMainNew”是进度条和后台工作者的主要形式。我将表单作为参数传递给MyClass对象 当我初始化它时。
这是我第一次使用backgroundworker,我还需要什么? 我已经看过这些例子并尝试过,但没有任何效果。 (1,2,3,4,5,6)。
我也必须将此用于其他功能。
我的代码:
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
答案 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