2016-03-17 2 views
2

Я просто застрял во что-то, в котором я никак не могу его решить. Мой пользовательский интерфейс блокируется даже с BackgroundWorker.Форма просто замораживает петли в линиях

Что касается моей старой решаемой задачи: 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 

Но он по-прежнему делает то же самое. Работайте отлично с небольшим количеством линий. Заморозьте мой текстовый файл 500 КБ.

+1

сообщение код, а не ссылку на код. 'Control.CheckForIllegalCrossThreadCalls = False' не является решением. Удалите эту строку и исправьте ошибки. Вы получаете доступ к элементам управления gui в фоновом потоке. – LarsTech

+1

почему цикл 100 раз. плюс каждый раз вы получаете доступ к текстовому файлу и загружаете его. – Claudius

+0

Сначала я зацикливал 100 раз, чтобы получить значение integer в progressbar. Я никогда не думал об этом, я попробую прямо сейчас без него. – Netero

ответ

1

Я считаю, что ваш фоновый рабочий все еще собирается заблокировать ваш поток пользовательского интерфейса, потому что вы ссылаетесь на элементы пользовательского интерфейса в части DoWork. Вам лучше было бы потянуть данные в потоке пользовательского интерфейса, назначить его переменной, а затем обработать все в памяти в DoWork вместо того, чтобы пытаться манипулировать пользовательским интерфейсом из фонового потока, это даст вам скорбь последовательно.

Итак, в вашем манипуляторе 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

Maybe лучший способ состоит в том, чтобы разбить этот большой текстовый файл как минимум на 50 штук и будет работать на этом пути ... – Netero

+1

Я бы шагнул через вашу логику, чтобы понять, почему он не работает должным образом :). Рад, что теперь он поддерживает поток пользовательского интерфейса. – davidallyoung

1

Ваша ссылка Pastebin включает следующий код:

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

На первый взгляд, почему вы положить нить спать на пятой секунды на каждой итерации для цикла?

Удалить эту строку для начала.

+1

Это не ответ. – LarsTech

Смежные вопросы