Vb.net 表单只是冻结通过行的循环

Vb.net 表单只是冻结通过行的循环,vb.net,backgroundworker,freeze,Vb.net,Backgroundworker,Freeze,我只是陷入了某种无法解决的困境。即使使用BackgroundWorker,我的UI也会冻结 关于我以前解决的问题: '我在文本文件中有以下格式的行: word1|word2|word3 anotherword1|anotherword2 我正在尝试将该文件的每一行中的每个单词逐个拆分,一旦程序检测到richtextbox是否有这些单词中的一个,就会用未拆分的行替换该单词。示例:从word1到word1 | word2 | word3' 一切都很好,但前提是我使用的文件中有一小部分要拆分的行。但

我只是陷入了某种无法解决的困境。即使使用BackgroundWorker,我的UI也会冻结

关于我以前解决的问题:

'我在文本文件中有以下格式的行:

word1|word2|word3
anotherword1|anotherword2
我正在尝试将该文件的每一行中的每个单词逐个拆分,一旦程序检测到richtextbox是否有这些单词中的一个,就会用未拆分的行替换该单词。示例:从word1到word1 | word2 | word3'

一切都很好,但前提是我使用的文件中有一小部分要拆分的行。但是我需要马上分一个大的

以下是我到目前为止的情况:

正如我所说,如果我减少en.txt文件的行数,一切都会正常工作,我有点困惑为什么。如果有人能告诉我如何解决这个问题,我将不胜感激

更新:

正如你们说的,看看我做了什么:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim list As New List(Of String)()
    Using reader As New StreamReader(Application.StartupPath & "\en.txt")
        Dim line As String = Nothing
        Dim input = RichTextBox1.Text
        While (InlineAssignHelper(line, reader.ReadLine())) IsNot Nothing
            Dim pat = String.Format("\b({0})\b", line)
            input = Regex.Replace(input, pat, line)
        End While
        RichTextBox2.Text = input
    End Using
End Sub

但它仍然如此。用少量的线可以很好地工作。冻结我的500kb文本文件。

您的Pastebin链接包含以下代码:

For i = 0 To 100
    Threading.Thread.Sleep(200)
    [...]
Next
乍一看,为什么在for循环的每次迭代中都让线程休眠五分之一秒


首先删除这一行。

我相信您的后台工作人员仍然会阻止您的UI线程,因为您在DoWork部分引用UI控件。您最好在UI线程上拉入数据,将其分配给一个变量,然后在DoWork中的内存中处理这些数据,而不是试图从后台线程操纵UI,这将给您带来一致的结果

因此,在button1.单击handler,从文本框中获取输入并将其分配给实例变量。在DoWork中为输入引用该实例变量

例如:

Public Class Form1

Private _textInput As String = String.Empty

Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    _textInput = RichTextBOx1.Text
    BackgroundWorker1.RunWorkerAsync()
  End Sub

 Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
    target = value
    Return value
End Function

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    For i = 0 To 100
         Threading.Thread.Sleep(200)
         Dim list As New List(Of String)()
        Using reader As New StreamReader(Application.StartupPath & "\en.txt")
            Dim line As String = Nothing
             While (InlineAssignHelper(line, reader.ReadLine())) IsNot Nothing
                Dim pat = String.Format("\b({0})\b", line)
                _textInput = Regex.Replace(_textInput , pat, line)
              End While
         End Using
         BackgroundWorker1.ReportProgress(i)
     Next
  End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    ProgressBar1.Value = e.ProgressPercentage
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MsgBox("done")
    RichTextBox1.Text = _textInput 
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub
End Class

发布代码,而不是代码的链接
Control.CheckForIllegalCrossThreadCalls=False
不是解决方案。删除该行并修复错误。您正在后台线程中访问gui控件。为什么循环100次。另外,您每次都要访问文本文件,并首先加载itAt。我循环了100次,以将整数的值输入progressbar。我从来没有想过,我现在就尝试不使用它。亲爱的朋友,我更新了问题。这不是答案。非常感谢你花时间尝试解决这个问题。我想你是对的。我试过了,它成功了,但不是在它应该是。1.它不能正常工作。它不再冻结,但你可以等三天,大文本文件不会发生任何事情。也许最好的方法是将大文本文件拆分为至少50个部分,然后按这种方式工作……我将逐步分析你的逻辑,然后看看它为什么不能正常工作:)。很高兴它现在为您保留了UI线程。是的。非常感谢你!很抱歉我忘了,或者是因为我是新来的,所以上次试的时候没用。再次感谢您的回答!