2012-01-23 87 views
1

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

您使用的是哪个版本的C#? – oleksii

回答

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()); 
+1

伟大的克里斯,你是男人,真是冠军。自从最近2-3天以来,我一直被困在这个问题上,你做了这个人,你做到了。 –

+1

heh,np,很乐意帮忙 –

2

你不使用线程池至于每个数据行,你创建一个新的线程。并限制池中的线程通常是bad idea

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

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

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