Multithreading 线程问题、同时线程限制、同时运行的最大线程数问题

Multithreading 线程问题、同时线程限制、同时运行的最大线程数问题,multithreading,threadpool,Multithreading,Threadpool,我试图对每个国家运行一个控制台进程。所有国家都在一个数据表中。因为每个国家的过程需要3-4天。我决定同时运行4个国家/地区,以消耗我的四核机器的全部4个四处理器 我编写了上面的代码,但这段代码的问题是,它同时运行所有线程。我想同时最多4个线程,其余的等待轮到他们。我不介意应用程序是否卡在country循环中,等待线程完成并立即启动下一个线程 private void Form1_Load(object sender, EventArgs e) { DataTable dt = new

我试图对每个国家运行一个控制台进程。所有国家都在一个数据表中。因为每个国家的过程需要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());
}

您没有使用线程池-您只是为每个国家/地区启动一个线程:

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());
对于创建新线程的每个数据行,不使用线程池。池中的限制线程通常是一个问题

更改螺纹中的最大螺纹数时要小心 水塘虽然您的代码可能会受益,但这些更改可能会产生不利影响 对您使用的代码库的影响

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


你可以使用
Parallel
Task
类来限制线程的数量。

你使用哪种版本的C#?太棒了,克里斯,你是真正的冠军。我从过去两三天就一直在处理这个问题,你做了这个人,你做了这个。