表单只是冻结循环通过行



我只是陷入了无法以任何方式解决它的事情。即使使用后台工作者,我的 UI 也会冻结。

关于我解决的旧问题:VB.NET - 它不断更换自己

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

word1|word2|word3
anotherword1|anotherword2

我正在尝试将该文件的每一行逐个拆分每个单词,一旦程序检测到富文本框是否具有这些单词之一,就会用未拆分的行替换该单词。示例:从单词 1 到 word1|单词 2|单词 3'

一切都很好,但前提是我使用带有一小组行的文件进行拆分。但是我需要一次拆分一个大的。

这是我到目前为止所拥有的: 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 文本文件。

我相信

您的后台工作人员仍然会阻止您的 UI 线程,因为您在 DoWork 部分中引用了 UI 控件。您最好在 UI 线程上拉入数据,将其分配给一个变量,然后在 DoWork 的内存中处理这些数据,而不是尝试从后台线程操作 UI,这会让您始终感到悲伤。

所以在你的按钮1。单击处理程序,从文本框中获取输入并将其分配给实例变量。在 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

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

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

一目了然,为什么要在 for 循环的每次迭代中让线程进入五分之一秒的睡眠状态?

为初学者删除此行。

最新更新