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