从嵌套的 Parallel.Foreach 中的函数返回
本文关键字:函数 返回 Parallel 嵌套 Foreach | 更新日期: 2023-09-27 18:30:37
这里是代码片段,我想在条件满足时退出函数。我怎样才能做到这一点?
bool MyNestedFunction()
{
Parallel.Foreach (ListofStrings_A, OuterString =>//loopA
{
Parallel.Foreach (ListofStrings_B, InnerString //loopB
{
string FirstTemperedString = Temperedstring.Substring(0,Temperedstring.LastIndexOf(" "));
string LastTemperedString = Temperedstring.Substring(Temperedstring.IndexOf(" "));
string FirstOuterString = OuterString.Substring(0, OuterString.LastIndexOf(" "));
string LastOuterString = OuterString.Substring( OuterString.IndexOf(" "));
if (FirstTemperedString.Equals(FirstOuterString) || LastTemperedString.Equals(LastOuterString))
{
return true; // I want to return from the function (MyNestedFunction)here
// What will be the alternate code here
}
});
})
return false;
}
返回 true 的替代语句是什么,它将退出此函数?
由于这两个循环可以在不同的线程上执行,因此必须在控制线程和处理 ForEach 调用的正在运行的线程之间引入共享状态。在这种情况下,可以假定布尔值是原子可更新的,因此是线程安全的,因此不需要锁定。
在 if 条件中,将result
布尔值设置为 true,然后调用 state.Stop();
以发出外循环应结束的信号。当它这样做时,控制权将返回到调用线程,而result
现在为 true,并且该值将返回给调用方。
bool MyNestedFunction()
{
bool result = false; // shared state!
Parallel.ForEach (ListofStrings_A, (OuterString, state) =>//loopA
{
Parallel.ForEach (ListofStrings_B, InnerString => //loopB
{
string FirstTemperedString = Temperedstring.Substring(0,Temperedstring.LastIndexOf(" "));
string LastTemperedString = Temperedstring.Substring(Temperedstring.IndexOf(" "));
string FirstOuterString = OuterString.Substring(0, OuterString.LastIndexOf(" "));
string LastOuterString = OuterString.Substring( OuterString.IndexOf(" "));
if (FirstTemperedString.Equals(FirstOuterString) || LastTemperedString.Equals(LastOuterString))
{
result = true; // set the return value
state.Stop(); // signal to Stop the ForEach on all Threads
}
});
});
return result;
}