我正在尝试针对每个国家/地区运行控制台进程。所有国家都在数据表中。由于每个国家的过程需要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());
}
答案 0 :(得分:2)
对于创建新线程的每个数据行,不使用 ThreadPool 。并且限制池中的线程通常为bad idea。
更改线程中的最大线程数时请小心 池。虽然您的代码可能会受益,但更改可能会产生不利影响 对您使用的代码库产生影响。
将线程池大小设置得太大会导致性能问题。 如果同时执行的线程太多,则任务切换 开销成为一个重要因素。
您可以使用Parallel
和Task
类来限制线程数。
答案 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());