线程问题,同时线程限制,同时运行的最大线程问题

时间:2012-01-23 22:22:54

标签: multithreading threadpool

我正在尝试针对每个国家/地区运行控制台进程。所有国家都在数据表中。由于每个国家的过程需要3-4天。我决定同时运行4个国家来使用我的四核机器的所有4个四处理器。

我编写了上面的代码,但是这段代码的问题是,它同时运行所有的线程。我想同时最多4个线程,其余的等待轮到他们。我不介意应用程序是否停留在country循环中并等待线程完成并立即启动下一个线程。

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 个答案:

答案 0 :(得分:2)

对于创建新线程的每个数据行,不使用 ThreadPool 。并且限制池中的线程通常为bad idea

  

更改线程中的最大线程数时请小心   池。虽然您的代码可能会受益,但更改可能会产生不利影响   对您使用的代码库产生影响。

     

将线程池大小设置得太大会导致性能问题。   如果同时执行的线程太多,则任务切换   开销成为一个重要因素。

您可以使用ParallelTask类来限制线程数。

答案 1 :(得分:1)

您没有使用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());