これは、横断的な懸念を伴う循環依存関係に対する私の回答に対する私自身の質問です。
特定のタスクが例外をスローするかどうかに関係なく、 Parallel.ForEach
可能なすべてのタスクが少なくとも試行されることを少なくとも保証するバリアントはありますか?
各タスクを独自のtry
/ catch
/finally
などで (直接的または間接的に) ラップし、同期されたコンテナーを使用して例外などを保存できることを認識していますが、それは多くの作業のように思えます-評価するための多くの可能な解決策があります--work Task Parallel ライブラリで処理する方がよいと思います。
Parallel.ForEach
タスク内で例外をスローするという私の試みは、途中で中止され、残りのタスクがキャンセルされる可能性があることを示唆しているようです)。の場合も同様のようです{some enumerable}.AsParallel().ForAll({the task});
。残りのタスクを中止する戦略、または残りのタスクを作成する前に中止する戦略は、状況によっては完全に受け入れられる動作だと思います。ただし、タスクが死んでしまうこともあるため、できるだけ多くのタスクを実行して、どのタスクが生き残り、どのタスクが死亡したかを追跡することをお勧めします。
Task Parallel Library を使用する場合、ハンドルされていないすべての例外を処理する方法を参照してください。しかし、それが私の質問に答えるかどうかはわかりません。
http://blogs.msdn.com/b/pfxteam/archive/2009/05/31/9674669.aspx <= も関連している可能性があります。
これは私にとって優先度の高い質問ではありません.
編集:動作を示すコードに実際にバグがある場合に備えて、ここにあります(他の質問にも関連しています)。私はこれを LinqPad で実行してきましたが、すべてのWriteLine
結果が表示される場合と表示されない場合があります。コードの品質に対する批判はやめてください。何が起こっているのかを理解しているかどうかを確認したいだけです。[ThreadStatic]
その変更された変数には何かがあるのではないかと思います。
static void Main() //Main(string[] args)
{
string[] messages = "this is a test. but it's going to be an issue!".Split(' ');
try{
messages.AsParallel().ForAll(Log);
} catch(AggregateException){
throw;
}
Console.ReadLine();
}
[ThreadStatic]
static bool _disable = false;
public static void Log(string message)
{
if (_disable)
{
return;
}
try {
_disable = true;
Console.WriteLine(GetPrefix() + message);
throw new Exception("bar");
} finally {
_disable = false;
}
}
public static string GetPrefix()
{
Log("Getting prefix!");
return "Prefix: ";
}