表格只是冻结循环线

时间:2016-03-17 18:34:16

标签: vb.net backgroundworker freeze

我只是陷入了无法以任何方式解决问题的事情。即使使用BackgroundWorker,我的UI也会冻结。

关于我以前解决的问题:VB.NET - It keep replacing itself

'我有这种格式的文本文件行:

word1|word2|word3
anotherword1|anotherword2

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

一切都很好,但前提是我使用的文件有一小组线要分开。但我需要立刻拆分一个大的。

以下是我目前的情况:http://pastebin.com/raw/k0MtPHbZ

正如我所说,如果我减少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文本文件冻结。

2 个答案:

答案 0 :(得分:1)

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

For i = 0 To 100
    Threading.Thread.Sleep(200)
    [...]
Next

乍一看,为什么在for循环的每次迭代中让线程休眠五分之一秒?

为初学者删除此行。

答案 1 :(得分:1)

我相信你的后台工作者仍然会阻止你的UI线程,因为你在DoWork部分引用了UI控件。你最好在UI线程中提取数据,将其分配给变量,然后在DoWork中处理所有内存,而不是尝试从后台线程操作UI,这将一直给你带来悲伤。

因此,在button1.Click处理程序中,从文本框中获取输入并将其分配给实例变量。在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