C# 生产者消费者在队列为空时等待?

C# 生产者消费者在队列为空时等待?,c#,queue,task,producer-consumer,C#,Queue,Task,Producer Consumer,我有一个需要按顺序处理的工作项列表。有时列表将是空的,有时它将有一千个项目。一次只能按顺序处理一个。目前我正在做以下事情,这对我来说很愚蠢,因为我正在使用线程。在检查列表是否为空之前,请在consumer任务中等待100毫秒。这是标准的做法还是我完全错了 public class WorkItem { } public class WorkerClass { CancellationTokenSource cts = new CancellationTokenSource();

我有一个需要按顺序处理的工作项列表。有时列表将是空的,有时它将有一千个项目。一次只能按顺序处理一个。目前我正在做以下事情,这对我来说很愚蠢,因为我正在使用线程。在检查列表是否为空之前,请在consumer任务中等待100毫秒。这是标准的做法还是我完全错了

public class WorkItem
{

}

public class WorkerClass
{
    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken ct = new CancellationToken();

    List<WorkItem> listOfWorkItems = new List<WorkItem>();

    public void start()
    {
        Task producerTask = new Task(() => producerMethod(ct), ct);
        Task consumerTask = new Task(() => consumerMethod(ct), ct);

        producerTask.Start();
        consumerTask.Start();
    }

    public void producerMethod(CancellationToken _ct)
    {

        while (!_ct.IsCancellationRequested)
        {
            //Sleep random amount of time
            Random r = new Random();
            Thread.Sleep(r.Next(100, 1000));

            WorkItem w = new WorkItem();
            listOfWorkItems.Add(w);
        }
    }

    public void consumerMethod(CancellationToken _ct)
    {

        while (!_ct.IsCancellationRequested)
        {
            if (listOfWorkItems.Count == 0)
            {
                //Sleep small small amount of time to avoid continuously polling this if statement
                Thread.Sleep(100);
                continue;
            }

            //Process first item
            doWorkOnWorkItem(listOfWorkItems[0]);

            //Remove from list
            listOfWorkItems.RemoveAt(0);
        }
    }

    public void doWorkOnWorkItem(WorkItem w)
    {
        // Do work here - synchronous to execute in order (10ms to 5min execution time)
    }

}
公共类工作项
{
}
公营工人班
{
CancellationTokenSource cts=新的CancellationTokenSource();
CancellationToken ct=新的CancellationToken();
List listOfWorkItems=新列表();
公开作废开始()
{
任务producerTask=新任务(()=>producerMethod(ct),ct);
任务consumerTask=新任务(()=>consumerMethod(ct),ct);
producerTask.Start();
consumerTask.Start();
}
公共无效生成方法(取消令牌)
{
而(!\u ct.iscancellationrequest)
{
//随机睡眠时间
随机r=新随机();
睡眠(r.Next(1001000));
工作项w=新工作项();
工作项列表。添加(w);
}
}
public void consumerMethod(取消令牌)
{
而(!\u ct.iscancellationrequest)
{
如果(listOfWorkItems.Count==0)
{
//少量睡眠以避免连续轮询此if语句
睡眠(100);
继续;
}
//处理第一项
doWorkOnWorkItem(工作项列表[0]);
//从列表中删除
工作项列表。移除(0);
}
}
公共无效doWorkOnWorkItem(工作项w)
{
//在此执行工作-按顺序执行同步(执行时间为10毫秒至5分钟)
}
}
非常感谢你的建议

谢谢,您可以使用。

使用。它不进行非忙等待

有关简单示例,请参见。或者更详细一点