2012-01-23 13 views
1

各国に対してコンソールプロセスを実行しようとしています。すべての国はデータ可能です。各国のプロセスには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()); 
} 
+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です。

スレッド プールのスレッドの最大数を変更する場合は、注意してください。あなたのコードが有益であるかもしれないが、あなたが使っているコードライブラリに変更が加えられた場合は、 の影響があります。

スレッドプールのサイズを大きくしすぎると、パフォーマンス上の問題が発生する可能性があります。 同時に実行しているスレッドが多すぎる場合は、タスクの切り替え が重要な要素になります。

ParallelおよびTaskクラスを使用してスレッド数を制限できます。