在這篇關于 docs microsoft 的文章中,在 Parallel.For 的示例中,方法中有一個 Break 呼叫和處理諸如 ShouldExitCurrentIteration 和 LowestBreakIteration 等屬性,方法如下:
if (state.ShouldExitCurrentIteration)
{
if (state.LowestBreakIteration < i)
return;
}
LowestBreakIteration 存盤呼叫 Break 方法的最小迭代次數。此外,此屬性可以存盤內部生成的索引的值,例如在方法 Parallel.ForEach 的情況下(來自docs microsoft)
問題。如果是 Parallel.ForEach,我應該如何處理屬性 LowestBreakIteration,我應該如何使用它以及我應該與什么進行比較?
我很容易地用 Break for Parallel.For 重復了這個例子,但我無法弄清楚如何在帶有 Break for Parallel.ForEach 的例子中使用屬性 LowestBreakIteration。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//Parallel.For
void MyMethodForParallelForBreak(int i, ParallelLoopState MyParallelLoopState)
{
Console.WriteLine($"Start {i}");
if (MyParallelLoopState.ShouldExitCurrentIteration)
{
if (MyParallelLoopState.LowestBreakIteration < i) //Processing LowestBreakIteration here
{
Console.WriteLine($"Current {i}. Return: LowestBreakIteration {MyParallelLoopState.LowestBreakIteration} < {i}");
return;
}
}
if (MyParallelLoopState.LowestBreakIteration != null)
{
Console.WriteLine($"Current {i}. LowestBreakIteration {MyParallelLoopState.LowestBreakIteration}");
}
if (i > 5)
{
MyParallelLoopState.Break();
Console.WriteLine($"Current {i}. Break");
}
Console.WriteLine($"End {i}");
}
Parallel.For(1, 11, MyMethodForParallelForBreak);
Console.WriteLine("\n");
//Parallel.ForEach
void MyMethodForParallelForEachBreak(KeyValuePair<string, string> MyKeyValuePair, ParallelLoopState MyParallelLoopState)
{
Console.WriteLine($"Start {MyKeyValuePair.Key}");
if (MyParallelLoopState.ShouldExitCurrentIteration)
{
if (MyParallelLoopState.LowestBreakIteration < ) //Error. Unknown. Processing LowestBreakIteration here
{
Console.WriteLine($"Current {MyKeyValuePair.Key}. Return: LowestBreakIteration {MyParallelLoopState.LowestBreakIteration} < Unknown");
return;
}
}
if (MyParallelLoopState.LowestBreakIteration != null)
{
Console.WriteLine($"Current {MyKeyValuePair.Key}. LowestBreakIteration {MyParallelLoopState.LowestBreakIteration}");
}
if (MyKeyValuePair.Value == "a")
{
MyParallelLoopState.Break();
Console.WriteLine($"Current {MyKeyValuePair.Key}. Break");
}
Console.WriteLine($"End {MyKeyValuePair.Key}");
}
Dictionary<string, string> MyDictionaryForStringAndString = new Dictionary<string, string>();
MyDictionaryForStringAndString.Add("a1", "abc");
MyDictionaryForStringAndString.Add("a2", "ab");
MyDictionaryForStringAndString.Add("a3", "a");
MyDictionaryForStringAndString.Add("a4", "abc");
MyDictionaryForStringAndString.Add("a5", "ab");
MyDictionaryForStringAndString.Add("a6", "a");
MyDictionaryForStringAndString.Add("a7", "abc");
MyDictionaryForStringAndString.Add("a8", "ab");
MyDictionaryForStringAndString.Add("a9", "a");
MyDictionaryForStringAndString.Add("a10", "abc");
Parallel.ForEach(MyDictionaryForStringAndString, MyMethodForParallelForEachBreak);
}
}
}
uj5u.com熱心網友回復:
如果您想在Parallel.Foreach回圈中檢查 LowestBreakIteration,則有一個帶引數的多載Action<TSource, ParallelLoopState, long>。其中 long-value 表示索引。
我會注意到 LowestBreakIteration/ShouldExitCurrentIteration 的使用對我來說似乎很深奧。我能想象的唯一用例是每次迭代都涉及多個昂貴的操作,因此您希望盡快退出,并且您仍然希望在呼叫中斷的迭代之前處理所有專案。
我肯定從來沒有覺得需要這樣的功能,雖然為那些確實需要它的人提供它可能很好,但我不會擔心。
uj5u.com熱心網友回復:
您可以檢查ShouldExitCurrentIteration屬性以查看是否需要退出并行 foreach:
if (state.ShouldExitCurrentIteration) {
// some other thread called state.Break()
return;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/391056.html
上一篇:如何改進我的多執行緒代碼
