2010-11-12 214 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互斥的最佳途徑? 我是新來的c#多線程,我的概念是從Linux內核,所以事情可能會更容易在C#中的類已建成誰實現它...

所以我的問題是'有更好的設計,更好的實踐,更好的方式來做到以上?

+1

你爲什麼要在一個線程中更新數據庫? – 2010-11-12 19:44:09

+0

@Pieter好問題:)讓我們假設我從Threadpool創建線程來處理它......好的建議隊友:),正如我所提到的,我在數據庫和c#字段中的體驗 – 2010-11-12 19:48:29

+1

線程池中的線程?我想知道:如果你在一個不同的線程上寫數據庫,然後等待它,你爲什麼不直接在線程本身寫數據庫呢? – 2010-11-12 19:51:12

回答

1

如果您真的只是將數據寫入數據庫,您應該看看是否可以將它寫入線程本身而不是在單獨的線程中。如果這是遠程可能的,這將爲您節省很多麻煩。

+0

正如我所提到的那樣,供應商需要時間做出反應(讓我們假設這是一個很遠的服務器,需要一分鐘的時間來完成訂單......) – 2010-11-12 19:58:51