Vb.net 在多任务功能中更新进度条

Vb.net 在多任务功能中更新进度条,vb.net,Vb.net,我正在尝试使用类函数中的Form1.ProgressBar1.PerformStep()更新Form1上的进度条。我正在使用异步函数。有10个进程正在运行,但进度条应根据While循环中读取(以及随后处理)的记录值进行更新。看起来我无法使用下面的代码更新GUI。我试过begininvoke和invoke,但运气不好。有什么想法吗 Await Cheque.MultiProcessCheques() Public Shared Async Function MultiProcessChequ

我正在尝试使用类函数中的Form1.ProgressBar1.PerformStep()更新Form1上的进度条。我正在使用异步函数。有10个进程正在运行,但进度条应根据
While循环中读取(以及随后处理)的记录值进行更新。看起来我无法使用下面的代码更新GUI。我试过
begininvoke
invoke
,但运气不好。有什么想法吗

 Await Cheque.MultiProcessCheques()

 Public Shared Async Function MultiProcessCheques() As Task
            Dim tasks As New List(Of Task)()
            For i As Integer = 0 To 9
                Dim temp_i As Integer = i
                tasks.Add(Task.Run(Function() Cheque.CopyBinaryValueToFile(temp_i)))
            Next
            Await Task.WhenAll(tasks)
 End Function

 Public Shared Async Function CopyBinaryValueToFile(i As Integer) As Task
            Try
                Using connection = ConnectionController.GetConnection
                    Await connection.OpenAsync()
                    Using command = ConnectionController.GetCommand
                        command.CommandText = ("SELECT ch.RECORDID FROM TABLE WHERE VALUE = '%" & i & "'")
                        command.Connection = connection
                        command.CommandTimeout = 0
                        Using reader As Common.DbDataReader = Await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess)
                            While Await reader.ReadAsync()
                                If reader.HasRows Then

                                End If
' update Progress bar here
                                Form1.ProgressBar1.PerformStep() 
                            End While
                        End Using
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show("1" & ex.ToString)
            End Try
        End Function
    End Class

创建共享成员以在支票类中保存Form1引用,并修改MultiProcessChecks()函数以接收引用:

Public Class Cheque

    Private Shared F1 As Form1

    Public Shared Async Function MultiProcessCheques(ByVal f1 As Form1) As Task
        Cheque.F1 = f1

        ' ... other code ...

    End Function

    Public Shared Async Function CopyBinaryValueToFile(i As Integer) As Task

        ' ... other code ...

        Cheque.F1.Invoke(Sub()
                             Cheque.F1.ProgressBar1.PerformStep()
                         End Sub)

        ' ... other code ...

    End Function

End Class
然后,当你叫它时,请输入“我”:

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    ' ... other code ...

    Await Cheque.MultiProcessCheques(Me)

    ' ... other code ...

End Sub

这段代码是从Form1中运行的?…还是另一个类?Form1是启动对象吗(您正在访问上面代码段中Form1的“默认实例”<代码>调用()
是正确的方法。很可能您需要引用Form1的正确实例。将对Form1实例的引用传递到另一个类中,这样您就可以对正确的实例调用
Invoke()
。@Idle\u请注意,我是通过Form1中的按钮调用这个类(check),如下所示:wait check.multiprocesschecks()。这是一门不同的课。解决方案中只有一个项目。我如何按照你的建议传递对前一个实例的引用?@Idle\u Mind好的,我相信我理解你的意思。我创建了一个公共的Form1作为新的Form1。然后在初始化组件后,我有oform1=me,然后引用oform1典型的idel\u mind,始终使用正确的解决方案。棒 极 了