2015-05-25 3 views
0

Я использую очередь, есть два потока. Один для Enqueue, другой для Dequeue. Которые называются соответственно производителем и потребителем. Продукция может быть неограниченной. Но мне нужно ограничить потребителей, работающих одновременно. Я читал о «Параллельной библиотеке задач» и «Параллель.Для». Но я не уверен в том, как это реализовать. Пожалуйста, посоветуй мне. Вот некоторые из сегментов коды для вас, имеющих более глубокого понимания вопросаОграничить количество пользователей для очереди, которые работают параллельно

static void Main(string[] args) 
{ 

// The Producer code comes here 
// ... 

// The Consumer code comes here 
Thread consumer = new Thread(new ThreadStart(PendingBookingConsumer)); 
consumer.Start(); 
} 

private static void PendingBookingConsumer() 
{ 
    try 
    { 
     while (true) 
     { 
      if (pendingBookingsQueue != null && pendingBookingsQueue.Count > 0) 
      { 
       PendingBooking oPendingBooking = pendingBookingsQueue.Dequeue(); 

       //Run the Console App 
       string command = @"C:\ServerAgentConsole.exe"; 
       string args = oPendingBooking.Id + " " + oPendingBooking.ServiceAccountEmail.Trim() + " " + oPendingBooking.ServiceAccountPassword.Trim() + " " + oPendingBooking.ServiceAccountEmail.Trim() 
        + " " + oPendingBooking.MailBoxOwnerEmail.Trim() + " " + oPendingBooking.Method.Trim(); 

       Process process = new Process(); 
       process.StartInfo.FileName = command; 
       process.StartInfo.Arguments = args; 
       process.EnableRaisingEvents = true; 

       process.Exited += (sender, e) => 
       { 
        Process myProcess = (Process)sender; 
        Console.WriteLine("Agent for booking ID :" + myProcess.StartInfo.Arguments[0] + " Done"); 
       }; 

       process.Start(); 
       Thread.Sleep(2); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

ответ

0

BlockingCollection поддерживает верхнюю границу

BlockingCollection Constructor (Int32)

Как Ганс заметил это только размер коллекции.
Возможно, вы можете сделать это параллельно с потребителем.

+0

Спасибо, я постараюсь это. –

+2

Это для ограниченного * размера * коллекции, это не имеет никакого отношения к числу потребительских потоков. –

+0

@ ХансПасант ОК. Удалит, когда получит принятый ответ. – Paparazzi

1

Use one of the common techniques to process a BlockingCollection with a fixed degree of parallelism. Укажите DOP в параметрах Parallel.ForEach.

Затем сделать функцию обработки ожидания для дочернего процесса:

process.Start(); 
process.WaitForExit(); 

Таким образом, у вас есть определенное количество дочерних процессов в любой момент времени.

0

Вы можете также рассмотреть TPL Dataflow библиотеки, с легкой реализацией для Producer/Consumer шаблона:

private static BufferBlock<int> m_buffer = new BufferBlock<int>>(
    new DataflowBlockOptions { BoundedCapacity = 10, MaxDegreeOfParallelism = 4 }); 

// Producer 
private static async void Producer() 
{ 
    while(true) 
    { 
     await m_buffer.SendAsync(Produce()); 
    } 
} 

// Consumer 
private static async Task Consumer() 
{ 
    while(true) 
    { 
     Process(await m_buffer.ReceiveAsync()); 
    } 
} 

Вы можете увидеть BoundedCapacity, используемый для метода дросселирования, что ограничивает размер очереди, и MaxDegreeOfParallelism используется для ограничивая параллельные задачи потребления.

Вы можете скачать introduction to TPL Dataflow from MSDN here.

PS: How to: Implement a Producer-Consumer Dataflow Pattern на MSDN

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