1

我有一个在一个线程上运行的类,它侦听数据并将其推送到字符串的 ConcurrentQueue 中。我正在使用 Enqueue 向其中添加数据,我可以看到队列长度正在增长,因此我知道数据正在正确排队。

然后在另一个线程上运行的另一个类应该以 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

除了使用 Count() 检查队列中的项目数外,我还尝试过 IsEmpty。结果一样!?

虽然似乎有很多关于在 C# 中使用 ConcurrentQueue 的文章,但我没有找到任何 VB.Net 示例,所以我有点卡住了。

帮助 !

更新:包装我的 While ... End While in a Do ... Loop 确实有效,但是当什么都没有发生时会占用线程,因此可能不建议这样做。有没有更优雅的方法来做到这一点?

4

1 回答 1

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
于 2016-09-09T22:08:17.217 回答