C# 当队列中有新项目时如何出列

C# 当队列中有新项目时如何出列,c#,.net,queue,C#,.net,Queue,我有一个应用程序,它使用带有字符串的队列(对应于应用程序需要执行的不同任务)。在随机时刻,队列中可能会充满字符串(比如有时一分钟几次,但也可能需要几个小时) 到目前为止,我一直有一个计时器,每隔几秒钟检查队列中是否有项目,并将其删除 我认为一定有比这种方式更好的解决方案。当一个项目被添加到队列中时,有什么方法可以获取事件吗?我会看一看。默认情况下,集合将使用队列进行备份,这是一种很好的方法,可以在使用简单的foreach循环添加值时自动从队列中获取值 还有一个允许您提供CancellationT

我有一个应用程序,它使用带有字符串的队列(对应于应用程序需要执行的不同任务)。在随机时刻,队列中可能会充满字符串(比如有时一分钟几次,但也可能需要几个小时)

到目前为止,我一直有一个计时器,每隔几秒钟检查队列中是否有项目,并将其删除

我认为一定有比这种方式更好的解决方案。当一个项目被添加到队列中时,有什么方法可以获取事件吗?

我会看一看。默认情况下,集合将使用队列进行备份,这是一种很好的方法,可以在使用简单的
foreach
循环添加值时自动从队列中获取值

还有一个允许您提供
CancellationToken
的方法,这意味着您可以很好地突围。

是的。特别是,看看,它的作用与
BlockingCollection
差不多,没有利用
async/Wait
阻塞线程的不良副作用

因此,您可以:

void Main()
{
    var b = new BufferBlock<string>();
    AddToBlockAsync(b);
    ReadFromBlockAsync(b);
}

public async Task AddToBlockAsync(BufferBlock<string> b)
{
    while (true)
    {
        b.Post("hello");
        await Task.Delay(1000);
    }
}

public async Task ReadFromBlockAsync(BufferBlock<string> b)
{
    await Task.Delay(10000); //let some messages buffer up...
    while(true)
    {
        var msg = await b.ReceiveAsync();
        Console.WriteLine(msg);
    }
}
void Main()
{
var b=新的缓冲块();
AddToBlockAsync(b);
ReadFromBlockAsync(b);
}
公共异步任务AddToBlockAsync(缓冲块b)
{
while(true)
{
b、 波斯特(“你好”);
等待任务。延迟(1000);
}
}
公共异步任务ReadFromBlockAsync(缓冲块b)
{
等待任务。延迟(10000);//让一些消息缓冲起来。。。
while(true)
{
var msg=await b.ReceiveAsync();
控制台写入线(msg);
}
}
您看过了吗?
getConsumineumerable()
方法允许在使用者上运行一个无限循环,一旦一个项目可用,就会产生新的项目,而不需要计时器或线程。Sleep的:

//常见的:

  BlockingCollection<string> _blockingCollection =
                     new BlockingCollection<string>();

您使用的队列是由您实现的吗?不是,我只是使用System.Collections.Queue
 for (var i = 0; i < 100; i++) 
 {
    _blockingCollection.Add(i.ToString());
    Thread.Sleep(500); // So you can track the consumer synchronization. Remove.
 }
   foreach (var item in _blockingCollection.GetConsumingEnumerable())
   {
      Debug.WriteLine(item);
   }