【问题标题】:Threading issue, simultaneous thread limit, maximum threads running at the same time issue线程问题,同时线程限制,同时运行的最大线程问题
【发布时间】:2012-02-17 06:21:19
【问题描述】:

我正在尝试针对每个国家/地区运行控制台进程。所有国家都在一个数据表中。由于每个国家/地区的流程需要 3-4 天。我决定同时跑 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());
}

【问题讨论】:

  • 您使用哪个版本的 C#?

标签: multithreading threadpool


【解决方案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());

【讨论】:

  • 伟大的克里斯,你就是那个人,真正的冠军。自从过去 2-3 天以来,我一直被这个问题困扰,你做了这个人,你做了这个。
【解决方案2】:

您不使用 ThreadPool,因为您为每个数据行创建一个新 Thread。而限制线程池中的线程一般为bad idea

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2013-03-18
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多