我有一个场景,多个生产者在网络中的不同机器上运行。这些是单例 WCF 服务,它们在中央存储中对产品(输出)进行排队,这也是单例 WCF 服务。
有些消费者通过 JSON 请求调用中央存储,将产品从中央存储中取出。通过解决某些优先级约束来交付产品。生产者在一分钟内以非常高的速度生产约 10000 件产品,其目的是以同样的速度为消费者提供服务,而不是让他们等待。
只要我有 3-4 个生产者和最多 10 个消费者,一切都很好。但是当我增加生产者和消费者时,一切都冻结了。
我使用的是TimedLock,它是 Monitor.TryEnter 的包装器。我已经尝试过所有类型的同步技术,例如 ReaderWriterLockSlim 和 Web 上的其他帖子,但结果是一样的。我避免使用 ReaderWriterLockSlim,因为我的写入次数多于读取次数。
因为我无法控制由 WCF 生成的消费者和生产者线程,因为它们可以访问 Singleton Store。我无法实现 Web 上可用的生产者/消费者示例。以下是数据存储的示例代码。
public class Store:IEnumerable<Product>
{
private List<Product> _Products;
private object _MonitorLock;
public Store()
{
_Products = new List<Product>();
_MonitorLock = new object();
}
public void Add(Product Product)
{
lock (_MonitorLock)
{
_Products.Add(Product);
}
}
public void Remove(Product Product)
{
lock (_MonitorLock)
{
_Products.Remove(Product);
}
}
public int Count
{
get
{
lock (_MonitorLock)
{
return _Products.Count;
}
}
}
public IEnumerator<Product> GetEnumerator()
{
List<Product> ProductsCopy;
lock (_MonitorLock)
{
ProductsCopy = new List<Product>(_Products);
}
foreach (Product oEntry in ProductsCopy)
yield return oEntry;
}
public Product GetHighestPriorityProduct()
{
Product oProduct;
lock (_MonitorLock)
{
//Some Logic to Resolve the Priority
_Products.Remove(oProduct);
}
return oProduct;
}
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}