2012-02-23 4 views
0

Я немного новичок в потоковом режиме, так как до сих пор я никогда не нуждался в нем на продвинутом уровне.убивающие темы от основного

У меня есть следующая проблема, мне нужно решить:

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

Я знаю, что это можно сделать с помощью ThreadPool, но мне нужно немного больше функциональности, я не знаю, как это сделать, чтобы он выполнял обратный вызов, когда все потоки выполнялись, и функция для остановки всех потоков и очередей, если необходимо.

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

+0

показывая некоторый код было бы хорошо – Beatles1692

+0

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

+2

Это зависит от задач, которые эти потоки пытаются выполнить. Если все эти потоки разворачивают задачу, тогда это звучит как хороший кандидат для очереди Продюсер-Потребитель. –

ответ

3

Вы можете использовать Task с и CancellationToken S:

 var taskCount = 10; 
     var cancellationTokenSource = new CancellationTokenSource(); 
     for (int i = 0; i < taskCount ; i++) 
     { 
      var cancellationToken = cancellationTokenSource.Token; 
      Task.Factory.StartNew(() => 
      { 
       // do work here. 

       // Also periodically check 
       if(cancellationToken.IsCancellationRequested) 
        return; 

       // or wait on wait handle 
       cancellationToken.WaitHandle.WaitOne(timeout); 
      }, cancellationToken); 
     } 

     // to cancel all threads 
     cancellationTokenSource.Cancel(); 

Количество потоков, работающих одновременно управляется для вас по ThreadPool внутри TaskFactory, на основе представленных ядер процессора вашей машины. Если вы хотите больше контроля, возможно, вы можете представить свои собственные TaskFactories, которые я считаю.