2016-03-17 90 views
2

我只是陷入了某種我無法解決的問題。即使使用BackgroundWorker,我的UI也會凍結。窗體只是凍結線條循環

關於我的老解決的問題:VB.NET - It keep replacing itself

「我有這種格式的文本文件行:

word1|word2|word3 
anotherword1|anotherword2 

我試圖通過每一個每行每一個字一個分裂該文件和一旦程序檢測到richtextbox是否具有這些單詞中的一個,則將用未分離的行替換該單詞。例如:從word1到word1 | word2 | word3'

一切都很好,但只有當我使用帶有一小組行的文件才能分割時。但我需要立即拆分一個大的。

這是我到目前爲止有:http://pastebin.com/raw/k0MtPHbZ

正如我所說的,一切正常,如果我減少en.txt文件的線條和我有點困惑,爲什麼。如果有人會告訴我如何解決這個問題,我將不勝感激。

UPDATE:

正如你們說看我做了什麼:

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文本文件凍結。

+1

郵政代碼,不將碼的鏈接。 'Control.CheckForIllegalCrossThreadCalls = False'不是解決方案。刪除該行並修復錯誤。您正在後臺線程中訪問gui控件。 – LarsTech

+1

爲什麼循環100次。再加上你每次訪問文本文件並加載它 – Claudius

+0

首先,我循環100次以獲取整數值進度條。我從來沒有想過,我現在就會嘗試沒有它。 – Netero

回答

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 
+0

非常感謝您花費您的時間來解決這個問題。我想你說得對。我嘗試過,但它的工作,但不是它應該。 http://prntscr.com/agj711/direct 1.它不能正常工作 2.現在不凍結,但你可以等待三天,什麼都不會與那家大文本文件 – Netero

+0

可能發生最好的辦法是將這個大文本文件分割成至少50個文件,然後按照這種方式工作... – Netero

+1

我會逐步理解你的邏輯,然後看看爲什麼它不能正常工作:)。很高興它現在讓你的UI線程免費。 – davidallyoung

1

你的引擎收錄鏈路包括下面的代碼:

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

一目瞭然,你爲什麼把線程睡眠第二的五分之一在for循環的每次迭代?

刪除此行的初學者。

+1

這不是一個答案。 – LarsTech