Проблема с потоками, ограничение одновременных потоков, максимальное количество потоков, запущенных одновременно - PullRequest
1 голос
/ 24 января 2012

Я пытаюсь запустить консольный процесс для каждой страны. Все страны в данных. Так как процесс для каждой страны занял 3-4 дня. Я решил запустить 4 страны одновременно, чтобы использовать все четыре четырехъядерных процессора моей четырехъядерной машины.

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

private void Form1_Load(object sender, EventArgs e) 
{
    DataTable dt = new DataTable("Countries");

    #region DataProcessing
    DataColumn dc1 = new DataColumn();
    dc1.DataType = System.Type.GetType("System.Int32");
    dc1.ColumnName = "CountryID";

    DataColumn dc2 = new DataColumn();
    dc2.DataType = System.Type.GetType("System.String");
    dc2.ColumnName = "CountryName";

    dt.Columns.Add(dc1);
    dt.Columns.Add(dc2);

    DataRow dr = dt.NewRow();
    dr["CountryID"] = 1;
    dr["CountryName"] = "US";
    dt.Rows.Add(dr);

    //similar code...

    dr = dt.NewRow();
    dr["CountryID"] = 20;
    dr["CountryName"] = "KR";
    dt.Rows.Add(dr);
    #endregion

    ThreadPool.SetMaxThreads(5, 5);

    foreach (DataRow drLoop in dt.Rows) 
    {
        Thread job = new Thread(new ParameterizedThreadStart(ThreadJob), 5);
        job.Start(drLoop["CountryName"].ToString());
    }
}
static void ThreadJob(Object country) 
{
    //Do Something
    MessageBox.Show(country.ToString());
}

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Вы не используете ThreadPool , поскольку для каждой строки данных вы создаете новую Поток .И ограничение потоков в пуле, как правило, является плохой идеей .

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

Слишком большой размер пула потоков может вызвать проблемы с производительностью.Если одновременно выполняется слишком много потоков, затраты на переключение задач становятся значительным фактором.

Вы можете использовать классы Parallel и Task, чтобы ограничить количество потоков.

1 голос
/ 24 января 2012

Вы не используете ThreadPool - вы просто запускаете тему для каждой страны:

foreach (DataRow drLoop in dt.Rows) 
{
    Thread job = new Thread(new ParameterizedThreadStart(ThreadJob), 5);
    job.Start(drLoop["CountryName"].ToString());
}

Попробуйте вместо этого:

foreach (DataRow drLoop in dt.Rows) 
    ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadJob), drLoop["CountryName"].ToString());
...