2016-09-03 3 views
0

私のプロジェクトでは、foreachループで何度も何度も何かしなければならないので、私はそれを約6-7時間待たなければなりません。例えばC#でマルチスレッドを使用するには?

:私がチェックする80件のドキュメントを持っている=>約8時間

foreach (var doc in docs) 
{ 
    bool valid = checkIsValid(doc); // about 2 min per doc 
    if (vaid) 
    { 
     doThing(doc); // about 5 min per doc 
    } 
    else 
    { 
     delete(doc); // about 20s per doc 
    } 
} 

だから、私が実行しているとき、私は大量のリソースを持って、同じ時間で、これらのものが使用されていません確認することができます考えます上記のコード。そして、私はC#がマルチスレッド機能を持っていることを知っています(私は何が提供できるのか分かりません)。

私のプロジェクトで使用できますか?私のプロジェクトでどのように使用するのですか?

理想:80人のドキュメントが同時にチェックされており、80スレッドが終了したときにforeachループが終了します。

foreach (var doc in docs) 
{ 
    //new thread start 
    bool valid = checkIsValid(doc); // about 2 min per doc 
    if (vaid) 
    { 
     doThing(doc); // about 5 min per doc 
    } 
    else 
    { 
     delete(doc); // about 20s per doc 
    } 
    //thread die 
} 
+1

上で動作し、適切に考慮して作成したタスク(スレッド)を使用するには、https://msdn.microsoft.com/en-us/library/system(Parallel.ForEachを試してみました.threading.tasks.parallel.foreach(v = vs.110).aspx)? –

+0

@DovydasSopaいいえ、私は持っていません。私はそれをチェックします。ありがとう –

+1

あなたは80のコアを持っていない限り、80のスレッドはCPUを奪います。何もしようとする前にマルチスレッドを学ぶべきです。間違ってしまうのはとても簡単です。また、実際のアルゴリズムの複雑さをチェックしましたか?何かを削除するには20秒かかる*巨大*。 –

答えて

2

Parallel.ForEachを見ましたか?そこC#で並行性を達成するための複数の方法があるが、それぞれの方法で撮影した時は、あなたが持っているコアの数に依存

Parallel.ForEach(docs, doc => { 
    if (checkIsValid(doc)) 
     doThing(doc); 
    else 
     delete(doc); 
}); 
+0

どのリソースを使用していますか?ルーカス氏によると、マルチスレッド化はCPUリソースのコストがかかります。並列はどうですか? –

+0

CPUとメモリのリソースが同じです。ちょうどそのコードの多くをあなた自身で書く必要はありません。 –

+0

Parralel.ForEachループでインターネット(3〜4 MB)から何かをダウンロードしようとすると危険ですか? –

1

:あなたのコードは次のようになります。 'Parallel.ForEach' は1つのオプションで、おそらく最も簡単な方法ですが、可能であれば作業項目を中断させて実行をスピードアップします。

次のコードはマルチスレッド化していますが、80スレッドは過剰なスレッドである可能性があるので注意してください。だから、

foreach (var doc in docs) 
{ 
    //new thread start 
    bool valid = checkIsValid(doc); // about 2 min per doc 
    if (vaid) 
    { 
     Task.Factory.StartNew(() => doThing(doc); 
    } 
    else 
    { 
     delete(doc); // about 20s per doc 
    } 
    //thread die 
} 

タスクフレームワーク4にし、

+0

doThing(string doc)が(ネットワークからファイルをダウンロードする=>編集する=>置き換える)、delete(string doc)がホストサイトの文書を削除する場合、Parallel.ForEachを使用するよりもソリューションが優れていますか? –

+0

Parallel.ForEachとTasksの間には常に議論があります。私がそれを見る方法は、最初のものが自動的に行われ、タスクはユーザーによって明示的に行われます。 CPUと実行時間を監視して決定を下す必要があります。現在のソリューションよりも迅速に結果を達成するための2つのオプションがあります。 – snit80

+0

サーバが同時に80スレッドを処理できない場合。私は最初にそれらの部分を実行し、その後他を実行することはできますか?例えば、4つのスレッドのみが同時に実行されます。 –

関連する問題