1

ここにコード スニペットがあります。条件が満たされたときに関数を終了します。どうすればこれを達成できますか?

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;
}

この関数を終了する return true の代替ステートメントは何ですか?

4

1 に答える 1

3

2 つのループは異なるスレッドで実行できるため、制御スレッドとForEach呼び出しを処理する実行中のスレッドとの間で共有状態を導入する必要があります。この場合、ブール値はアトミックに更新可能であると想定できるため、スレッドセーフであるため、ロックは必要ありません

if 条件で bool を true に設定し、外側のループが終了する必要があることを知らせるためresultに呼び出します。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;
}
于 2014-02-11T22:17:18.280 に答える