2016-09-09 29 views
0

データをリッスンして文字列のConcurrentQueueにプッシュするクラスを1つのスレッドで実行しています。 Enqueueを使用してデータを追加しています。キューの長さが増えているので、データが正しくキューされていることがわかります。VB.Net:スレッド上のConcurrentQueueからアイテムを取得する

別のスレッドで実行される別のクラスは、FIFOベースで各データを取り出す必要があります。しかし、それは単に何もしません。

Dim data As String = Nothing 

While Globals.queueMessages.Count > 0 

    queueMessages.TryDequeue(data) 
    If (data IsNot Nothing) Then 
     Console.WriteLine(data) 
    Else 
     Console.WriteLine("Failed to dequeue") 
    End If 
End While 

と同様にカウントを使用して、キュー内の項目数をチェックする()私は、あまりにものisEmptyを試してみた:ここキューからデータをプルする必要があることループです。同じ結果!

C#でConcurrentQueueを使用することについての記事がかなりあるようですが、VB.Netの例は見つかりませんでした。

ヘルプ!

更新:私のWhile ... Endでの終了While ... Whileループは機能しますが、何も起こっていないときにスレッドを張っているので、おそらく推奨されません。これを行うよりエレガントな方法はありますか?

答えて

1

わかったように、キューが空で、ループを中断しないようにするためには、ループを継続する必要があります。ちょっとした睡眠だけで睡眠を取って補充することができます。あなたの操作がいつ終了するかを制御するための単純なブーリアンフラグは、終了に必要なすべてのものです。

Dim data As String = Nothing 

    While mCancel = False 

     If queueMessages.TryDequeue(data) Then 
      Console.WriteLine(data) 
     Else 
      Console.WriteLine("Empty") 
      Thread.sleep(50) 
     End If 

    End While 
+0

ブール値フラグを使用することについてのヒントは、私はそれを考えていませんでした。スレッドにはsleep()プロパティがありません。 Dim threadParser AsをTask = Nothingとして作成してから、threadParser = Task.Factory.StartNew(Sub()Parser.Process())でスレッドを開始すると、スレッドへの切り替えが改善されるでしょうか? –

+0

一般的なルールはスレッドプールスレッドでスリープしません。それが短命のものなら、それに向かう。あなたのスレッドがアプリケーションの寿命の間にハングアップする場合は、専用のスレッドを追加します。読み込みsystem.threading thread.sleepにアクセスする – FloatingKiwi

+0

Windowsアプリケーションがある限り、スレッドはハングします。理想的には、これは数日または数週間かかるため、スレッドに変換して正常に動作しています。どうもありがとうございました ! –

関連する問題