private async Task CalculateEquity() { cts = new CancellationTokenSource(); IsCalculationRunning = true; var result = new List <double[]>(); try { LogProvider.Log.Info("Equity calculation started"); var boardString = GetBoardText(); result = await HoldemEquityCalculator.CalculateEquityAsync( PlayersList.Select(x => string.Join(",", x.GetPlayersHand(true))), boardString, EquityCalculatorMode == EquityCalculatorMode.HoldemSixPlus, cts.Token); } catch (OperationCanceledException) { LogProvider.Log.Info("Equity calculation stopped by user."); } catch (Exception ex) { LogProvider.Log.Error(this, "Equity calculation error.", ex); } finally { IsCalculationRunning = false; cts.Dispose(); cts = null; LogProvider.Log.Info("Equity calculation finished."); } if (result.Count() == PlayersList.Count()) { for (int i = 0; i < result.Count(); i++) { PlayersList.ElementAt(i).EquityValue = result[i][0]; PlayersList.ElementAt(i).WinPrct = result[i][1]; PlayersList.ElementAt(i).TiePrct = result[i][2]; } } IsCanExport = true; }