привет я хочу построить простую программу, которая делаеткак обрабатывать ОЧЕРЕДЬ потоков в 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# может быть проще, чем кто-то, кто уже построил, кто его реализует ...
поэтому мой вопрос: «Есть ли лучший дизайн, лучшая практика, лучший способ сделать это?
Почему вы обновляете базу данных в одном потоке? –
@Pieter хороший вопрос :) давайте предположим, что я создаю поток из Threadpool, чтобы справиться с этим ... хороший совет mate :), как я уже упоминал, я окунулся в базу данных и поля C# –
Нить из пула потоков? Мне было интересно: если вы стреляете из БД, пишите на другой поток, а затем просто ждете его; почему бы вам просто не написать DB в самом потоке? –