H C# метод на задаче, выполняющейся более 1 раза иногда, должен быть только 1
Привет всем, у меня есть приложение C# с задачей, этот вызов метода обычно выполняется 1 раз, но каждый раз через некоторое время он будет делать 2 вызова. Я использую это с "реальными деньгами", поэтому выполнение метода более 1 раза неприемлемо. У меня есть задача, которая всегда выполняется в фоновом режиме, проверяя состояние. Как только его встретили, он делает другой метод. Я попытался добавить счетчик, но он происходит дальше в программе, и он все еще выполняет более 1 выполнения. Есть какие-нибудь мысли или предложения?
private async Task ExecuteTradeTask() { cancelExecuteTask = new CancellationTokenSource(); tExecuteTask = Task.Run(async () => { while (true) { cancelExecuteTask.Token.ThrowIfCancellationRequested(); var delayTask = Task.Delay(1000); if (runHistory) { //if (executeTaskRunning) //{ try { if (TradesNow.ContainsKey("Trade1B")) { if (TradePriceValidBuy(CurrentTrade.Price, TradesNow["Trade1B"].StopPrice)) { var response = await StopBuyAsync(TradesNow["Trade1B"].StopPrice, TradesNow["Trade1B"].LimitPrice, TradesNow["Trade1B"].CryptoAmount); //if failure make global guid and global bools and run async // Set for 'CHECKING' current Trade Status. currentGUID = response.Id.ToString(); runStatus = true; trade1B = false; TradesNow.Remove("Trade1B"); //RefreshTradesToDo(); PrintToDoTradesAsync(); // GetTradeStatusAsync(response.Id.ToString()); if (!tStatusTask.Status.Equals(TaskStatus.Running)) { await GetTradeStatusAsync(); } return; } } } catch (Exception) { //MessageBox.Show("Trade Created Exception.\n" + ex.Message, "Error", // MessageBoxButton.OK, MessageBoxImage.Error); return; } // } } await delayTask; } }, cancelExecuteTask.Token); } private async Task<OrderResponse> StopBuyAsync(decimal stopPrice, decimal limitPrice, decimal cryptoAmount) { StopOrders stopOrder = new StopOrders(stopPrice, limitPrice, cryptoAmount); OrderResponse response; try { response = await tradeClient.StopOrderBuy(stopOrder); } catch(Exception) { throw; } return response; } public async Task<OrderResponse> StopOrderBuy(StopOrders order) { //if (!running) { running = true; } //else running = false; OrderResponse response; int isValid = 0; //if(isValid == 0) //{ try { response = await coinbaseProClient.OrdersService.PlaceStopOrderAsync ( OrderSide.Buy, ProductType.BtcUsd, order.CryptoAmount, order.LimitPrice, order.StopPrice ); isValid++; } catch(Exception)// ex) { throw;// ex; } //} return response; ///return isValid; }
Что я уже пробовал:
Я попытался добавить счетчик в метод, но это происходило дальше в программе, так что это не сработало. Это происходит не каждый раз, а только иногда. Но мне это нужно, чтобы этого "никогда" не случилось. Я вызываю API для
var response = await StopBuyAsync(TradesNow["Trade1B"].StopPrice, TradesNow["Trade1B"].LimitPrice, TradesNow["Trade1B"].CryptoAmount);
Это та часть, которая может произойти только один раз.