0

我基本上在做的是在一系列字母组合上并行迭代,当我得到我想要的组合时,它被认为是胜利。我想从这个查询中获得所有的胜利(它做得正确),但诀窍是如何跟踪执行胜利测试的次数(基本上是返回真/假的方法,它赢了)。

我正在类中创建一个实例变量,每次执行组合测试时都会递增,但每次运行该过程时,我都会为该实例变量获得不同的数字。我意识到这是一个线程问题,但我不确定如何解决它。

当遇到此问题时,查询需要停止的获胜次数有一个最大限制。如果我没有那个约束,我显然不需要知道组合运行的次数,因为它会运行所有组合,但是正如你所见,当我达到最大值时我需要中断查询限制。

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 回答