Метод C# вызывается несколько раз, но блокирует его только на 1 выполнение одновременно.
У меня есть некоторый код, который подключен к websocket. И он может выполнить менее 0,0005 мс, так что его можно вызвать в основном мгновенно несколько раз. Я могу позволить этому коду выполняться только один раз за раз. После завершения выполнения кода он может быть выполнен снова.
public partial class MainWindow : Window { static readonly object lockIt = new object(); private void TurnOnSocket(){ var incoming = SocketClient.SubscribeToTradeUpdatesAsync("BTCUSD",(data) => { if ((tExecute == null) || !tExecute.Status.Equals(TaskStatus.Running)) { ExecuteTradeDelay(); //lock (lockIt) //{ // // if(counterExecute == 0) // // { // // counterExecute++; // ExecuteTradeAsync(); // // } // //} //} _ = AddNewIncomingTradeAsync(data); //counterExecute = 0; // AddNewTrade(data); // UpdateLstIncoming(); // tradingClient.AddNewTrade(data); } } } private async Task ExecuteTradeDelay() { await Task.Delay(1500); lock (lockIt) { if(counterExecute == 0) { counterExecute++; _ = ExecuteTradeAsync(); } } await Task.Delay(2500); counterExecute = 0; } private async Task ExecuteTradeAsync() { cancelExecute = new CancellationTokenSource(); //if (counterExecute == 0) //{ //counterExecute++; if (running) { //lock (lockSafe) //{ tExecute = Task.Factory.StartNew(async () => { try { if (!did1B) { if (ActiveTrades.ContainsKey("Trade1B")) { if(UnsureWhyPriceValid(Convert.ToDecimal(CurrentPrice.Price), ActiveTrades["Trade1B"].StopPrice)) { StopOrder stopOrder = new StopOrder(ActiveTrades["Trade1B"].TradeSymbol, ActiveTrades["Trade1B"].StopPrice, ActiveTrades["Trade1B"].LimitPrice, ActiveTrades["Trade1B"].CryptoAmount); var placedOrder = await tradingClient.StopOrderBuyAsyncV2(stopOrder).ConfigureAwait(false); AddTradeStatusList(placedOrder, "Trade1B"); HarkinsLogger.Log("Trade 1 - Buy Executed & added to 'TradeStatusList'"); trade1B = false; ActiveTrades.Remove("Trade1B"); _ = PrintActiveTradesAsync(); return; } } } } }
Что я уже пробовал:
Я пробовал использовать оператор блокировки, использовать счетчик и переключать множество различных частей кода, чтобы это произошло правильно. Я получил код, функционирующий так, как я хочу, или, по крайней мере, я думаю, что я делаю.. его работа на данный момент, я создал метод TradeDelay, но я знаю, что этот код не настроен должным образом, и я хотел бы узнать правильную реализацию. Я считаю, что смогу полностью удалить этот TradeDelay() и мой "счетчик", как только все будет настроено правильно.
Gerry Schmitz
Если это сработает, то сработает. A (quick) "Q&A" - это не обсуждение тезисов.