2013-05-12 3 views
0

У меня есть список с несколькими элементами. Я ищу простой способ запускать каждый раз определенное количество потоков. Как я могу контролировать, закончилась ли моя цепочка потоков, и я должен начать следующий пакет.C# - Как создать определенные части потоков пакетов из массива потоков

foreach (ListViewItem item in listViewEx1.CheckedItems) 
{          
    vList.Add((V)item.Tag); 

    Thread tr = new Thread(new ParameterizedThreadStart(Deploy)); 
    threads.Add(tr); 
    tr.Start((object)item.Tag); 
} 

Благодаря

ответ

0

Вы можете использовать Semaphore для обратного отсчета количества бегущих потоков и освобождения потоков от семафора.

То есть, я бы для другой установки:

  • пут этот вид управления потоками в отдельном классе (не привязан к UI)

  • Оставьте создание потоков на время выполнения с помощью библиотеки Task Parallel Library, создать Tasks и оставить пакетирование на время выполнения (отнимает много коды управления и чешую к аппаратным средствам.

+0

Большое спасибо за помощь. Можете ли вы приложить к ней фрагмент кода, чтобы продемонстрировать его для меня. – EldadC

+0

Чтобы продемонстрировать, что? Надеюсь, вы понимаете, что я не буду писать ваш код. Постарайтесь сделать это сами, и если/когда вы застрянете, не стесняйтесь обращаться за помощью. –

+0

Я разрешаю свою проблему, используя Семафор, чтобы ограничить количество запущенных потоков. – EldadC

0

Почему бы не использовать BackgroundWorker?

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

BackgroundWorker bw = new BackgroundWorker(); 
bw.WorkerReportsProgress = true; 
bw.WorkerSupportsCancellation = true; 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 

if (bw.IsBusy != true) 
{ 
    bw.RunWorkerAsync(); 
} 
if (bw.WorkerSupportsCancellation == true) 
{ 
    bw.CancelAsync(); 
} 
private void bw_DoWork(object sender, DoWorkEventArgs e) { } 
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } 
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { } 

Когда bw_RunWorkerCompleted событие вызывается, то вы знаете, что ваш поток закончился.

+0

Привет, спасибо за усилия. Итак, для каждого нового потока будет создан новый объект bw, BW заменит обычные потоки. – EldadC

+0

Мое мнение заключается в том, чтобы заменить ваши темы работниками фона, если это возможно. Я не думаю, что это хорошая практика для создания фонового рабочего для каждого потока (слишком много потоков!). –

0

Если вы используете .NET Framework 4.0, вы можете использовать параллельный LINQ:

// First, fill the vList-collection. 
vList.AddRange(listView1.CheckedItems.Cast<ListViewItem>().Select(item => (V)item.Tag)); 
// Second, for each item, call Deploy, but do this parallel. 
listView1.CheckedItems.Cast<ListViewItem>().AsParallel().ForAll(item => Deploy(item.Tag)); 

(Поскольку у меня не было весь код (как Deploy и vList) Я не уверен, если он будет компилировать, но это это только направление.)

+0

Спасибо за помощь. Развертывание - это просто метод, который я выполняю в коде. vList - это список объектов: Список vmList = новый Список (); – EldadC

+0

Что такое 'VM'? Является ли VM отличным от 'V'? Ну, это не имеет большого значения, я просто пытался указать на вас в направлении «AsParallel». –

+0

Привет, извините V - это VM, пропустил его, VM - класс. – EldadC

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