TheBigBearNow Ответов: 1

C# WPF лучший способ запустить метод/или проверить в фоновом режиме, чтобы проверить, попадает ли условие


Привет всем1.
У меня есть программа, которая работает и постоянно обновляет свойство объекта. Я даже не был уверен, что лучший способ сделать это, я сделал это с помощью Task.Run(). Он проверяет глобальное условие ‘bool’ и запускается в конструкторе класса графического интерфейса пользователя. Я обновляю свойство класса здесь, и если оно достигает определенной цены, я хотел бы выполнить другой метод. Я хочу, чтобы он выполнял код на том, что находится в кнопке click (), только если цена попадает в условие. Как вы думаете, что было бы лучшим способом постоянно проверять это ценовое условие? И выполните код одним нажатием кнопки

        public MainWindow()
        {
            InitializeComponent();
            
            dataTable = CreateDataTableTrades();

            _ = TradeAsync(dataTable);


        }
private async Task TradeAsync(DataTable dt)
        {
            while (true)
            {
                var delayTask = Task.Delay(1000);
                if (running)
                {
                    try
                    {
                       var response = await Task.Run(() => tradeClient.GetTradeHistory());
                        var stackTs = new Stack<ProductTrade>(response);
                        foreach(var trade in stackTs)
                        {
                            if(TradeID_NotExists(trade, dt))
                            {
                                CurrentTrade = UpdateCurrentTrade(trade, CurrentTrade);
                                
                                //PrintProdTrades(response);
                                PrintProductTrade(trade);
                                AddTradeToDt(trade, dt);
                                BindDT2DG(dt);
                            }
                        }
                        
                    }
                    catch (Exception e) { MessageBox.Show(e.Message); }
                }
                await delayTask;
            }
        }
private async void BtnTrade1_Sell_Click(object sender, RoutedEventArgs e)
        {
            string stopStr = "", limitStr = "", cryptoStr = "";
            bool isValid = false;

            if(!String.IsNullOrEmpty(txt1Sprice.Text) &&
                !String.IsNullOrEmpty(txt1Slimit.Text) &&
                !String.IsNullOrEmpty(txt1Scrypto.Text))
            {
                stopStr = txt1Sprice.Text;
                limitStr = txt1Slimit.Text;
                cryptoStr = txt1Scrypto.Text;
                StopOrders stopOrder = new StopOrders();
                bool stopBool=false, limitBool=false, cryptoBool=false;

                try
                {
                    if(decimal.TryParse(stopStr, out decimal stopPrice))
                    {
                        stopOrder.StopPrice = stopPrice;
                        stopBool = true;
                    }
                    if (decimal.TryParse(limitStr, out decimal limitPrice))
                    {
                        stopOrder.LimitPrice = limitPrice;
                        limitBool = true;
                    }
                    if (decimal.TryParse(cryptoStr, out decimal crypto))
                    {
                        stopOrder.CryptoAmount = crypto;
                        cryptoBool = true;
                    }

                    if(stopBool && limitBool && cryptoBool)
                    {
                        var response = await tradeClient.StopOrderSell(stopOrder);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Order Created Exception.\n" + ex.Message, "Error",
                                     MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }


Что я уже пробовал:

У меня есть сделать Task.run с глобальной переменной bool в графическом интерфейсе. У меня также был он работающий с CancellationTokenSource но теперь я хочу запускать метод в фоновом режиме непрерывно до тех пор пока он не остановится и когда условие попадет для запуска кода в кнопке нажмите если кнопка была включена или включена

RickZeeland

Task.Run предпочтительнее, чем StartNew при использовании Async, см.: https://blog.stephencleary.com/2013/08/startnew-is-dangerous.html

1 Ответов

Рейтинг:
2

#realJSOP

Рассматривали ли вы возможность настройки свойства для запуска пользовательского события при изменении его значения, а затем иметь обработчик событий в форме, которая реагирует на это событие? Нитки не нужны.


TheBigBearNow

Это звучит как потрясающее решение не могли бы вы дать мне небольшой пример того, что вы имеете в виду ?

#realJSOP

Используете ли вы MVVM в своем приложении?

TheBigBearNow

Да

#realJSOP

Тогда у вас уже должна быть идея, как сделать то, что я предложил. На самом деле вы можете использовать событие subscribe to the object's propertychanged из свойства и просто посмотреть, является ли желаемое свойство причиной его срабатывания, и если да, то делать все, что вы хотите сделать.