Vb.net 我的第二个后台工作人员赢了';行不通

Vb.net 我的第二个后台工作人员赢了';行不通,vb.net,backgroundworker,Vb.net,Backgroundworker,我已经创建了2个BackgroundWorker,我的第二个BackgroundWorker似乎根本不工作,我在“Private Sub BackgroundWorker 2_DoWork”下放置了一个messagebox指示器,它被触发了,但它下面的代码没有。下面是我的后台工作人员遇到问题的完整代码。这是什么原因造成的 我真的需要为我的程序2个后台工作人员,因为它正在处理吨的文件,使应用程序挂断 Private Sub Button2_Click(sender As Object, e As

我已经创建了2个BackgroundWorker,我的第二个BackgroundWorker似乎根本不工作,我在“Private Sub BackgroundWorker 2_DoWork”下放置了一个messagebox指示器,它被触发了,但它下面的代码没有。下面是我的后台工作人员遇到问题的完整代码。这是什么原因造成的

我真的需要为我的程序2个后台工作人员,因为它正在处理吨的文件,使应用程序挂断

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Try
        If BackgroundWorker2.IsBusy <> True Then
            BackgroundWorker2.RunWorkerAsync()
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub

Private Sub BackgroundWorker2_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
    Dim worker1 As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
    Try
        MessageBox.Show("the program was able to open me")
        'this message box above was able to display but the codes below were not processed 
        Dim Stream As System.IO.FileStream

        Dim Index As Integer = 0

        Dim openFileDialog1 As New OpenFileDialog()
        openFileDialog1.InitialDirectory = "D:\work\base tremble"
        openFileDialog1.Filter = "txt files (*.txt)|*.txt"
        openFileDialog1.FilterIndex = 2
        openFileDialog1.RestoreDirectory = True

        If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Try
                'This line opens the file the user selected and sets the stream object
                Stream = openFileDialog1.OpenFile()
                If (Stream IsNot Nothing) Then
                    'create the reader here and use the stream you got from the file open dialog
                    Dim sReader As New System.IO.StreamReader(Stream)
                    Do While sReader.Peek >= 0
                        ReDim Preserve eArray(Index)
                        eArray(Index) = sReader.ReadLine
                        RichTextBox3.Text = eArray(Index)
                        Index += 1
                        worker1.ReportProgress(Index)
                        'Delay(2)
                    Loop
                    Label1.Text = "0/" & eArray.Length & ""
                End If
            Catch Ex As Exception
                MessageBox.Show(Ex.Message)
            Finally
                If (Stream IsNot Nothing) Then
                    Stream.Close()
                End If
            End Try
        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Private Sub BackgroundWorker2_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker2.ProgressChanged
    Try
        'Label1.Text = e.ProgressPercentage.ToString()
        Me.ProgressBar2.Value = e.ProgressPercentage
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Private Sub BackgroundWorker2_Completed(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker2.RunWorkerCompleted
    Try

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub
Private子按钮2\u单击(发送者作为对象,e作为事件参数)处理按钮2。单击
尝试
如果BackgroundWorker2.IsBusy为True,则
BackgroundWorker2.RunWorkerAsync()
如果结束
特例
MessageBox.Show(例如Message)
结束尝试
端接头
私有子BackgroundWorker2_DoWork(发送方作为System.Object,e作为System.ComponentModel.DoWorkEventArgs)处理BackgroundWorker2.DoWork
Dim worker1作为System.ComponentModel.BackgroundWorker=CType(发送方,System.ComponentModel.BackgroundWorker)
尝试
Show(“程序能够打开我”)
'上面的消息框可以显示,但下面的代码未被处理
将流变暗为System.IO.FileStream
作为整数的Dim索引=0
将openFileDialog1设置为新的OpenFileDialog()
openFileDialog1.InitialDirectory=“D:\work\base-tremble”
openFileDialog1.Filter=“txt文件(*.txt)|*.txt”
openFileDialog1.FilterIndex=2
openFileDialog1.RestoreDirectory=True
如果openFileDialog1.ShowDialog()=System.Windows.Forms.DialogResult.OK,则
尝试
'此行打开用户选择的文件并设置流对象
Stream=openFileDialog1.OpenFile()
如果(流不是什么)那么
'在此处创建读取器,并使用从“文件打开”对话框获得的流
Dim sReader作为新的System.IO.StreamReader(流)
当sReader.Peek>=0时执行
雷迪姆保留耳环(索引)
耳环(索引)=sReader.ReadLine
RichTextBox3.Text=array(索引)
指数+=1
worker1.报告进度(索引)
"延误(二)
环
Label1.Text=“0/”&array.Length&“
如果结束
特例
MessageBox.Show(例如Message)
最后
如果(流不是什么)那么
Stream.Close()
如果结束
结束尝试
如果结束
特例
MessageBox.Show(例如Message)
结束尝试
端接头
私有子BackgroundWorker2\u ProgressChanged(发送方作为System.Object,e作为System.ComponentModel.ProgressChangedEventArgs)处理BackgroundWorker2.ProgressChanged
尝试
'Label1.Text=e.ProgressPercentage.ToString()
Me.ProgressBar2.Value=e.ProgressPercentage
特例
MessageBox.Show(例如Message)
结束尝试
端接头
私有子BackgroundWorker2_已完成(发件人作为System.Object,e作为System.ComponentModel.RunWorkerCompletedEventArgs)处理BackgroundWorker2.RunWorkerCompleted
尝试
特例
MessageBox.Show(例如Message)
结束尝试
端接头

我已将OpenFileDialog设置为另一个按钮,并在backgroundworker中处理了将数据重新存储到阵列中的过程,现在可以正常工作了


感谢backgroundworker中不允许使用OpenFileDialog的提示。它给了我一个提示。

我已将OpenFileDialog设置为另一个按钮,并在backgroundworker中处理了将数据重新存储到阵列中的过程,现在可以使用了


感谢backgroundworker中不允许使用OpenFileDialog的提示。它给了我一个提示。

您不能在工作线程中使用OpenFileDialog。是否有其他方法?当我打开一个超过100000行的文本文件时,我的程序就会冻结。当然,只在BGW中执行缓慢的操作。OpenFileDialog不是问题所在。您不能在工作线程中使用OpenFileDialog。是否有其他替代方法?当我打开一个超过100000行的文本文件时,我的程序就会冻结。当然,只在BGW中执行缓慢的操作。OpenFileDialog不是问题所在。