8

私は、.NETの並列拡張でParallel.For()を使用することに慣れてきました。これはスレッドを手作業で開始して維持する必要がなく(単純なことかもしれませんが)、並列化の簡単な方法です。私は今パラレル化したい無限ループ(何かをやるためにシグナルを送るまで)を見ています。Parallel.For()のオーバーロードが無理なので、これを行うためのオーバーロードはありません。さあ。原則的には私のようなものだけで行うことができます:(?)並列無限ループを達成する最良の方法は何ですか?

Parallel.For(0, int.Max) 

をしかし、私はそれが処理する作業のパーティショニング・ロジックの予想/効率的なパターンではないかもしれません疑うよ

別のオプションのようなものです:

for(;;) 
{ 
    Parallel.For(0, 128, delegate() 
    { 
     // Do stuff. 
    } 
} 

しかし、それは気が抜けているように思えますし、効率の悪い作業分割につながる可能性もあります。

私の本能は、私自身のスレッドを作成して管理することによってこれを手動で行うことですが、これについていくつかのフィードバック/意見を得ることに興味があります。ありがとう。

=== === UPDATE

私は受け入れ答えで記事(私はParallelOptionsパラメータを削除した)からのコードの簡易版を使用しています。ここでは、コードだ...

public class ParallelUtils 
{ 
    public static void While(Func<bool> condition, Action body) 
    { 
     Parallel.ForEach(IterateUntilFalse(condition), ignored => body()); 
    } 

    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
     while (condition()) yield return true; 
    } 
} 

使用例は次のようになります。

Func<bool> whileCondFn =() => !_requestStopFlag; 
ParallelUtils.While(whileCondFn, delegate() 
{ 
    // Do stuff. 


}); 
+0

あなたが使用できるスレッドモデルはありますか – MethodMan

答えて

8

スティーブン・トゥブは約Implementing Parallel While with Parallel.ForEachの投稿をしています。

+2

スティーブン・トゥブのポストは、私のようなノブのためにかなり前進しています。最高の/推奨された方法の簡単な使用例は、非常に高く評価されるでしょう。 –

+0

これはコメントか回答ですか? – fubo

2

あなたが(本当に)、あなたは、いくつかのコアできるだけそれをしたい無限の何かをしたい場合。 Parallel.For___のどれも良い選択ではありません。

あなたが(おそらく)必要とするものは、別のスレッドまたはLongRunningオプションで作成されたタスクです。

そしてセマ​​フォで待つか、最後の手段としてSleep()を可能な限り頻繁に呼び出します。

+1

この問題のコンテキストは、データマイニングプロジェクトです。私は現在、すべてのコアで無期限に実行したいので、現在無期限に実行されているデータ解析コード(たとえば、夜間実行してから翌朝停止するように通知する)を複数のスレッドに渡しています。 – redcalx

+4

@locster - 子スレッドを作成するマスター "無限"スレッドを作成します。 –

1

それはINFINIT結石要求ですが、あなたはすべての「サイクル」にいくつかのFINIT状態を持っている必要があり、私はいくつかのイベント/状態に Parallel.ForEach(...)コールを実行するために、外部for(;;)ループを備えたソリューションを変更するだろうと言うことを考えると、変化する。 Monitorシグナルのように、event通知、またはそのようなもの...

関連する問題