2016-09-28 6 views
-1

序文:こんにちは、これはすべて私の最初の質問ですので、もし私がやったことや間違っていることを知らせてください。私はプロジェクトに取り組んでおり、その機能の1つは、データを処理し、特定の行の特定のテキストを置き換えて、richtextbox /ファイルに出力するための巨大なテキストを書き込むことです。Parallel Loop&Stringbuilder

問題:並列foreachを使用すると、richtextboxの結果がすべての場所にあることになります。行に沿ったものではありません(たとえば、並列foreachループの後に最初の行が15行目走る)。

コードが行うこと:リッチテキストボックスをループし、その行がテンポラリリッチテキストボックスの最初の行と一致するかどうかを確認します。追加するとテンポラリリッチテキストボックスからテキストをコピーし、過去のリッチテキストボックス内の行数と過去の行の量を加算してから、追加を続行します。それは基本的にテキストの置き換えです。合計出力私は約20Kラインを見ています。

Dim completertb4text As New StringBuilder("") 

Parallel.ForEach(newrtb.Lines, Function() New StringBuilder(), Function(x, [option], sb) 

If x.Contains(richtextboxl0) Then 
    startcount = True 
    sb.Append(vbNewLine & richtextbox3text & "111111") 
End If 

If startcount = True Then 
    If counter = temptextbox3count Then 
    startcount = False 
    Else 
    counter += 1 
    End If 
End If 

If sb.Length = 0 Then 
    sb.Append(vbNewLine & x & "222222") 
End If 

If sb.Length > 0 Then 
    sb.Append(vbNewLine & x & "3333333") 
End If 
Return sb 

Function, Sub(sb)  
    SyncLock completertb4text 
    completertb4text.Append(sb.ToString()) 
    End SyncLock 
End Sub 

ご協力いただきありがとうございます。

+0

質問が正しく理解されているかどうかわかりません...あなたのコードは次のようになっています:1.リッチテキストボックスで内容を読む2. RTBのテキストがTextBoxにある場合は、 3.更新されたコンテンツを他のRTBに書き込む。右??? – A3006

+0

はい、あなたは正しいです。 –

+0

Parallel.ForEachを使用して、あなたが望むものを実現できるのではないかと心配しています。 – A3006

答えて

0

私のコードを08:00から00:01秒に短縮したのは以下のとおりです。

  Dim counter As Integer = 0 
     Dim countertrue As Integer = 0 
     Dim countintertal As Integer = 0 


     Dim newrtbstrarray As String() = newrtb.Lines 
     Dim rtb3array As String() = richtextbox3text.Lines 

     For Each line As String In newrtbstrarray 

      If line.Contains(richtextboxl0) Then 
       countertrue = counter 
       For Each element As String In rtb3array 
        newrtbstrarray(countertrue) = rtb3array(countintertal) 
        countertrue += 1 
        countintertal += 1 
       Next 

      End If 

      counter += 1 
     Next