12

.Netの並列拡張機能でParallel.For()を使用することに慣れました。これは、スレッドを手動で開始して維持する必要がなく、コードを並列化する簡単な方法であるためです(面倒な場合があります)。私は今、並列化したい無限ループ(停止するように信号を送るまで何かをする)を見ています、これを行うための引数のないParallel.For()オーバーロードはないので、ここでの最良のアプローチは何でしょうか?なれ。原則として、私は次のようなことを行うことができます。

Parallel.For(0, int.Max)

しかし、それは作業分割ロジックが処理するための期待される/効率的なパターンではないかもしれないと私は思っています(?)

別のオプションは次のようなものです。

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

しかし、それはエレガントではないように思われ、非効率的な作業分割につながる可能性もあります。

今のところ、私の本能は、自分のスレッドを作成して維持することによってこれを手動で行うことですが、これに関するフィードバック/意見を得ることに興味があります。ありがとう。

===更新===

受け入れられた回答の記事のコードの簡略化されたバージョンを使用しています(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.


});
4

3 に答える 3

7

Stephen Toubが、Parallel.ForEachを使用したParallelの実装に関する投稿をしています。

于 2011-12-29T18:37:35.670 に答える
2

(本当に)無限の何かが必要な場合は、可能な限り少ないコアでそれを必要とします。どれもParallel.For___良い選択ではありません。

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

次に、セマフォを待機させるか、最後の手段として、できるだけ頻繁にSleep()を呼び出します。

于 2011-12-29T18:30:31.640 に答える
1

無限の微積分要求であることを考えると、「サイクル」ごとにfinit状態が必要であるため、イベント/状態の変更時に呼び出しfor(;;)を実行するために、外部ループを 使用してソリューションを変更すると思います。信号、通知、またはそのParallel.ForEach(...)ようなもののように...Monitorevent

于 2011-12-29T18:41:00.170 に答える