0

私が基本的にやっていることは、一連の文字の組み合わせを並行して反復することです。必要な組み合わせを取得すると、それが勝利と見なされます。このクエリからすべての勝利を取得したいのですが (これは正しく行われています)、勝利のテストが実行された回数を追跡する方法が秘訣でした (基本的には、勝利した true/false を返すメソッド)。 )。

コンボのテストが実行されるたびにインクリメントするクラスにインスタンス変数を作成していますが、プロセスを実行するたびに、このインスタンス変数に対して異なる番号が取得されます。スレッドの問題であることは認識していますが、解決方法がわかりません。

これがヒットしたときにクエリを停止する必要がある勝利の数には最大制限があります。その制約がなければ、すべてのコンボが実行されるため、明らかにコンボが実行される回数を知る必要はありませんが、ご覧のとおり、最大数に達したときにクエリから抜け出す必要があります。限界。

public Results GetWinResults()
{
         ParallelQuery<string> winningCombos = from n in _nextCombination.GetNextCombo().AsParallel()                                          
                       where processNextCombo(n) // where there was a win
                       select n;

         List<string> wins = new List<string>();

         foreach (var winningCombo in winningCombos)
         {
               wins.Add(winningCombo);
               if (wins.Count == winsMaxLimit)
                  break;
         }

         return new Results { Wins = wins, CombosTried = totalCombosRun };
 }


 private bool processNextCombo(string combo)
 {
     totalCombosRun++;
     // do tests to see if combo was a winner
     if (didWin)
        return true;
     return false;
 }
4

1 に答える 1

2

Interlockedクラスを使用して、スレッドセーフな方法で int をインクリメントできます。

 int totalCombosRun=0;

 private bool processNextCombo(string combo)
 {
     Interlocked.Increment(ref totalCombosRun);
     // do tests to see if combo was a winner
     if (didWin)
        return true;
     return false;
 }
于 2012-10-07T01:23:20.977 に答える