【发布时间】:2022-01-23 09:14:17
【问题描述】:
在 microsoft 上的这个 article 中,在 Parallel.For 的示例中,方法中有一个 Break 调用和对 ShouldExitCurrentIteration 和 LowestBreakIteration 等属性的处理,方式如下:
if (state.ShouldExitCurrentIteration)
{
if (state.LowestBreakIteration < i)
return;
}
LowestBreakIteration 存储调用 Break 方法的最小迭代次数。 此外,此属性可以存储内部生成的索引的值,例如在方法 Parallel.ForEach 的情况下(source on 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);
}
}
}
【问题讨论】:
标签: c# .net multithreading parallel-foreach