如何处理线程的队列c#

时间:2010-11-12 19:39:19

标签: c# .net multithreading

喜 我想构建一个简单的程序

  Parallel.ForEach(m_CustomerArr, customer =>
        {
            customer.OrderSomthing();
        });

当客户订购他查询数据库的东西时,当他的物品用完时他会联系供应商

      public bool takeOrder(Order o)
    {
            lock (s_QueueLocker)
            {
                OrderQueue.Enqueue(o);
            }
            //waits here to be signaled by the working thread of supplier 
            o.m_ManualResetEvent.WaitOne();**
        return true;
    }  

只有一个供应商拥有一个拥有supplierthread的队列:

   public void CreateThead()
    {
        Order currentOrder;
        while (true)
        {
            if (OrderQueue.Count != 0)
            {
                currentOrder = OrderQueue.Dequeue();
                DoOrder(currentOrder); 
            }
        }

    }
     private void DoOrder(Order currentOrder)
    {
        //update the db this function runes only in one thread 
        currentOrder.m_ManualResetEvent.Set();
        System.Threading.Thread.Sleep(5000);
    }

其中m_ManualResetEvent是传递给c'tor中每个订单的客户的成员

   public class Order
{
    public ManualResetEvent m_ManualResetEvent;
    public string m_Query;
    public int m_Quntity;

    public Order(ManualResetEvent customerManualResetEvent, string query, int quntity)
    {
        m_ManualResetEvent = customerManualResetEvent;
        m_Query = query;
        m_Quntity = quntity;
    }

}

什么是最好的方法来阻止线程等待(**)并在c中发信号通知他? 我是c#multi-threading的新手,我的概念来自Linux内核,所以C#在一个已经建立实现它的人的类中可能更容易......

所以我的问题是'有更好的设计,更好的实践,更好的方法来做上述事情吗?

1 个答案:

答案 0 :(得分:1)

如果您真的只是将数据写入数据库,您应该看看是否可以在线程本身而不是在单独的线程中编写它。如果这甚至可以远程实现,那将为您省去很多麻烦。