我目前正在用消息填充队列系统。当新消息开始传入时,应该有一个单独的线程打印队列。问题是我的程序不能工作。
private static void pData(IWebDriver driver)
{
Queue<string> messageToSend = new Queue<string>();
Thread printThread = new Thread(new ParameterizedThreadStart(PrintQueueMessages));
printThread.Start(messageToSend);
while (true)
{
messageToSend.Enqueue(GetLastElement(driver).Text));
}
}
private static void PrintQueueMessages(object messageQueue)
{
//Wont let me cast messageQueue as queue.
}我只想要一种简单而干净的方式来打印我的队列,因为我的while循环填满了我的队列。此外,队列系统应该继续等待消息,它应该永远不会停止等待消息和打印消息。
请注意:队列系统应该在自己的时间内工作。当消息进来时,它应该打印出来。
发布于 2021-02-25 09:23:16
我将建议一种完全不同的方法,而不是BCL队列,(在本例中) Unbounded Channel将是一个很好的选择
优点是
在多线程environment.
给定的
private static Channel<string> _channel;
public static async Task ReaderAsync(CancellationToken cancellationToken)
{
// read from the channel until complete
await foreach (var message in _channel.Reader.ReadAllAsync(cancellationToken))
Console.WriteLine("New message : " + message);
Console.WriteLine("Finished");
}测试
var ts = new CancellationTokenSource();
_channel = Channel.CreateUnbounded<string>();
// start the reader task
var task = ReaderAsync(ts.Token);
// post some junk to the channel, this can be on a different thread
for (var i = 0; i < 10; i++)
{
// some delay for the fun of it
await Task.Delay(10, ts.Token);
// write to the channel
await _channel.Writer.WriteAsync(i.ToString(), ts.Token);
}
// complete it when and if you are finished
_channel.Writer.Complete();
// just awaiting completion for this demo
await task;
Console.WriteLine("Game over");输出
New message : 0
New message : 1
New message : 2
New message : 3
New message : 4
New message : 5
New message : 6
New message : 7
New message : 8
New message : 9
Finished
Game overhttps://stackoverflow.com/questions/66361043
复制相似问题