CSharp - C#的FIFO队列改进

  显示原文与译文双语对照的内容
79 0

我正在处理一个分配,我应该实现一个队列来处理等待处理的( 。生产者使用者问题)的作业。 我必须开发一个比FIFO队列更有效的更好的队列。 在缺乏发生之前,有一些参数描述等待时间,它们需要在队列结束之后处理它们。 消费者在指定时间到来,可以等待指定时间,他们需要花一些时间执行他们想要做的事情。 你能帮我一个更好的队列而不是FIFO方法?

时间: 原作者:

61 4

First,如果你希望提高常规队列的性能,则可以基于元素的优先级实现队列,每次将元素添加到堆中时,都可以基于整数来实现优先级队列。

这里我附上了我在谷歌上找到的第一个链接,它是针对优先队列的。 插入的顺序为O ( 日志n ),如果你使用的是二进制堆

现在,如果要实现允许并发的队列,则需要隔离公共资源( 例如堆存储元素的基本结构) 。

Albahari 是一个很好的参考,以了解生产者消费者如何使用并发。

这里是所有可以用于实现生成者并发工作表for的并发性的类。

我正在添加一个示例,其中包含以下类型之一


//BlockingCollection with a fix number of Products to put, it works with 10 items max on the collection


 class Program


 {


 private static int counter = 1;


 private static BlockingCollection<Product> products =


 new BlockingCollection<Product>(10);



 static void Main(string[] args)


 {


//three producers


 Task.Run(() => Producer());


 Task.Run(() => Producer());


 Task.Run(() => Producer());



 Task.Run(() => Consumer());



 Console.ReadLine();


 }



 static void Producer()


 {


 while (true)


 {


 var product = new Product()


 {


 Number = counter,


 Name ="Product" + counter++


 };



//Adding one element


 Console.WriteLine("Producing:" + product);


 products.Add(product);



 Thread.Sleep(2000);


 }


 }



 static void Consumer()


 {


 while (true)


 {


//wait until exist one element


 if (products.Count == 0)


 continue;



 var product = products.Take();


 Console.WriteLine("Consuming:" + product);



 Thread.Sleep(2000);


 }


 }


 }



 public class Product


 {


 public int Number { get; set; }


 public string Name { get; set; }



 public override string ToString()


 {


 return Name;


 }


 }



...