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