2016-09-09 10 views
0

데이터를 수신하고 ConcurrentQueue 문자열로 푸시하는 한 스레드에서 클래스를 실행 중입니다. 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 Do ... 루프가 작동하지만 아무 일도 일어나지 않을 때 스레드가 묶여 있으므로 권장되지 않습니다. 이 일을 더 우아한 방법이 있습니까?

답변

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 가져 오기 – FloatingKiwi

+0

스레드는 Windows 응용 프로그램이 오랫동안 기다릴 것입니다. 이상적으로 이것이 며칠 또는 몇 주일 것이므로 스레드로 변환하여 정상적으로 실행 중입니다. 고마워요! –