TheBigBearNow Ответов: 1

Метод 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" - это не обсуждение тезисов.

1 Ответов

Рейтинг:
1

Garth J Lancaster

Цитата:
У меня есть некоторый код, который подключен к websocket. И он может выполнить менее 0,0005 мс, так что его можно вызвать в основном мгновенно несколько раз.
Я бы посмотрел на развязку логики приема и обработки - получить данные, поставить их в очередь, готово .. Другой поток обрабатывает элементы из очереди - таким образом, вы не слишком беспокоитесь о задержках, блокировке вашего WebSocket и т. д