[英]UI command *previous* to async task does not work if async task is enabled
我不能像我想象的那样掌握异步的东西,因为这已经让我挠头几个小时了。
我想要完成的是:
在我的视图中,我的 WPF 按钮有以下回调
private void Button_Click(object sender, RoutedEventArgs e)
{
GeneratorButton.IsEnabled = false;
ResultMsg.Visibility = Visibility.Visible; //default text of "Fetching data..."
string tickersString = Tickers.Text;
if (!string.IsNullOrEmpty(tickersString))
{
tickersString = tickersString.ToUpper();
string[] tickers = tickersString.Split(',', ' ');
var stockGeneratorTask = Task.Factory.StartNew<bool>(() => GetStockDataAndGenerateCSV(tickers).Result);
var allTasks = new Task[] { stockGeneratorTask };
var tasksHandler = Task.Factory.ContinueWhenAll(allTasks, completedTasks =>
{
return stockGeneratorTask.Result;
});
if (tasksHandler.Result)
{
ResultMsg.Foreground = Brushes.Green;
ResultMsg.Text = "Your report was successfully generated.";
}
else
{
ResultMsg.Text = "There was an error while generating your report. Please try again later.";
ResultMsg.Foreground = Brushes.Red;
}
}
GeneratorButton.IsEnabled = true;
}
我的期望是,一旦用户点击按钮,由于可见性属性开关,他们会看到“正在获取数据...”的默认文本。 据我所知,发生的事情是程序直接执行异步任务,当它返回时显示成功(或错误)消息,但它完全跳过“获取数据...”,除非我发表评论从 stockGeneratorTask 的声明中取出代码(没有发生异步调用)。
现在,如果这个可见性切换发生在异步任务被触发之前,我不应该在它实际进行异步调用之前看到这个变化吗? 为什么我回来后才看到?
事件处理程序是允许async void
的一个例外。 考虑使事件处理程序一直异步,而不是混合阻塞调用,如.Result
可能导致死锁。 假设GetStockDataAndGenerateCSV
返回Task<bool>
那么它应该被等待。
private async void Button_Click(object sender, RoutedEventArgs e) {
GeneratorButton.IsEnabled = false;
ResultMsg.Visibility = Visibility.Visible; //default text of "Fetching data..."
var tickersString = Tickers.Text;
if (!string.IsNullOrEmpty(tickersString)) {
tickersString = tickersString.ToUpper();
string[] tickers = tickersString.Split(',', ' ');
if (await GetStockDataAndGenerateCSV(tickers)) {
ResultMsg.Foreground = Brushes.Green;
ResultMsg.Text = "Your report was successfully generated.";
} else {
ResultMsg.Foreground = Brushes.Red;
ResultMsg.Text = "There was an error while generating your report. Please try again later.";
}
}
GeneratorButton.IsEnabled = true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.