2010-11-12 3 views
1

привет я хочу построить простую программу, которая делаеткак обрабатывать ОЧЕРЕДЬ потоков в C#

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; 
    } 

есть только один поставщик, который holdes очереди, которые имеют 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#, а моя концепция - от ядра Linux, поэтому в C# может быть проще, чем кто-то, кто уже построил, кто его реализует ...

поэтому мой вопрос: «Есть ли лучший дизайн, лучшая практика, лучший способ сделать это?

+1

Почему вы обновляете базу данных в одном потоке? –

+0

@Pieter хороший вопрос :) давайте предположим, что я создаю поток из Threadpool, чтобы справиться с этим ... хороший совет mate :), как я уже упоминал, я окунулся в базу данных и поля C# –

+1

Нить из пула потоков? Мне было интересно: если вы стреляете из БД, пишите на другой поток, а затем просто ждете его; почему бы вам просто не написать DB в самом потоке? –

ответ

1

Если вы действительно просто записываете данные в базу данных, вы должны увидеть, можно ли записать ее в самой нити, а не в отдельном потоке. Если это даже возможно, возможно, это сэкономит вам массу неприятностей.

+0

, как я уже упоминал, поставщик требует времени, чтобы отреагировать (предположим, что это отдаленный сервер, который занимает минуту, чтобы сделать заказ ...) –

Смежные вопросы