循环内的VB.Net异步后台工作程序

循环内的VB.Net异步后台工作程序,vb.net,multithreading,loops,progress-bar,backgroundworker,Vb.net,Multithreading,Loops,Progress Bar,Backgroundworker,我正在使用Vb.net visual studio 2008。我有一个进程(system.diagnostics.process)要在后台运行,它更新了Ui线程progressbar和一个标签,我使用backgroundworker.runworkerAsync进行了处理。现在的问题是,我必须用不同的输入在同一个过程中工作很多次 代码块是: Private Sub fnStartEvent(ByVal sender As System.Object, ByVal e As System.Even

我正在使用Vb.net visual studio 2008。我有一个进程(system.diagnostics.process)要在后台运行,它更新了Ui线程progressbar和一个标签,我使用backgroundworker.runworkerAsync进行了处理。现在的问题是,我必须用不同的输入在同一个过程中工作很多次

代码块是:

Private Sub fnStartEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.click

Dim inputFolder = Directory.GetFiles(textboxSourceFolder.text) 
Dim currentNumberOfFile As Integer=1
For each Files in inputFolder
   Dim arguments As Object = Files
   updateProgressStatus(0, currentNumberOfFile)
   BackgroundWorker1.WorkerReportsProgress = True
   BackgroundWorker1.RunWorkerAsync(New Object() {arguments})
  currentNumberOfFile += 1
  Next       
End Sub

  Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  'uses the arguments
      Dim Bg_process As System.Diagnostics.Process = New System.Diagnostics.Process
            With Bg_process.StartInfo
                .Arguments = str_arguments
                .FileName = ffmpegPath
                .CreateNoWindow = True
                .UseShellExecute = False
                .RedirectStandardOutput = True
                .RedirectStandardError = True
            End With

            Bg_process.Start()
            Dim outputReader As StreamReader = Bg_process.StandardError
            Dim output As String

            While Not Bg_process.HasExited
                output = outputReader.ReadLine()
                BackgroundWorker1.ReportProgress(0, output)
                Threading.Thread.Sleep(500)
            End While
      End Sub

 Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
   ' process args

updateProgressStatus(args(0), args(1) )
End Sub

Private Function BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)  Handles BackgroundWorker1.RunWorkerCompleted
            Messagebox.Show(e.error.ToString)
End Try

  Sub updateProgressStatus(ByVal progressValue As Integer, ByVal progressStatus As String)
progressBar.value = progressValue
lblprogressStatus.Text = progressStatus
      End Sub
这里的问题是FNStarteEvent方法一旦启动,它调用BackgroundWorker1.runWorkerAsync进程,该进程在一个单独的线程中运行,不等待线程完成,它移动到下一行代码,即循环到下一项,并返回到同一BackgroundWorker1.runWorkerAsync行,并抛出已在运行的异常

尝试 1.

但这不会更新用于表示进度的Ui线程

2.将整个进程放在DoWork线程中,并对其中的每个文件进行循环,但这将返回进程条更新中的跨线程错误


backgroundworker执行循环以等待完成以及在不阻塞UI的情况下更新UI的标准过程是什么

无论何时使用Thread.Sleep,您实际上是在休眠连接到启动类(即表单)的当前线程。因此,如果您睡眠您的主线程,将不会发生UI更新

根据MSDN关于的文章,您需要抛出一个Application.DoEvents。下面的代码是从上面链接的文章中复制的


Private Sub downloadButton_Click( _
    ByVal sender As Object, _
    ByVal e As EventArgs) _
    Handles downloadButton.Click

    ' Start the download operation in the background.
    Me.backgroundWorker1.RunWorkerAsync()

    ' Disable the button for the duration of the download.
    Me.downloadButton.Enabled = False

    ' Once you have started the background thread you 
    ' can exit the handler and the application will 
    ' wait until the RunWorkerCompleted event is raised.

    ' If you want to do something else in the main thread,
    ' such as update a progress bar, you can do so in a loop 
    ' while checking IsBusy to see if the background task is
    ' still running.
    While Me.backgroundWorker1.IsBusy
        progressBar1.Increment(1)
        ' Keep UI messages moving, so the form remains 
        ' responsive during the asynchronous operation.
        Application.DoEvents()
    End While
End Sub

感谢josaph,它可以工作了。但是有没有其他解决方案,bCoz这里出现了很多线程循环。

Private Sub downloadButton_Click( _
    ByVal sender As Object, _
    ByVal e As EventArgs) _
    Handles downloadButton.Click

    ' Start the download operation in the background.
    Me.backgroundWorker1.RunWorkerAsync()

    ' Disable the button for the duration of the download.
    Me.downloadButton.Enabled = False

    ' Once you have started the background thread you 
    ' can exit the handler and the application will 
    ' wait until the RunWorkerCompleted event is raised.

    ' If you want to do something else in the main thread,
    ' such as update a progress bar, you can do so in a loop 
    ' while checking IsBusy to see if the background task is
    ' still running.
    While Me.backgroundWorker1.IsBusy
        progressBar1.Increment(1)
        ' Keep UI messages moving, so the form remains 
        ' responsive during the asynchronous operation.
        Application.DoEvents()
    End While
End Sub