异步更新 UI
Asynchronously update UI
我正在玩异步操作,我现在的目标很简单。我只想在大型计算开始时更新文本字段,而我面临的问题是文本字段得到更新,但仅在 calculate()
returns 时更新,即使方法 computingMessage()
立即调用:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
annunciate();
calculate();
}
private void annunciate(){
Thread updateUI = new Thread( new ThreadStart( computingMessage ));
updateUI.Start();
}
private void computingMessage(){
txtVerification.Dispatcher.Invoke((Action)(
() => txtVerification.Text = "Calculating..."
));
}
请检查 Task 对象。
private void Button_Click(object sender, RoutedEventArgs e)
{
TextBoxOutput.Text = "calculating...";
Task.Factory
.StartNew(() => Calculate())
.ContinueWith(t =>
{
TextBoxOutput.Text = t.Result.ToString(CultureInfo.InvariantCulture);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
private int Calculate()
{
Thread.Sleep(2000); //--similate working....
return Environment.TickCount ^ 43;
}
希望对你有所帮助
虽然我在精神上同意@dbvega。我不同意 Task.Factory.StartNew
的用法。你也不应该使用 Dispatcher.Invoke
。默认情况下,当 运行 WPF 时,Task.Factory.CurrentScheduler
将设置为 WPF 消息泵调度程序。 运行WinForms时,有一个自动设置的WinForm调度器...
private async void Button_Click(object sender, RoutedEventArgs e)
{
TextBoxOutput.Text = "calculating...";
var result = await Task.Run(Calculate);
TextBoxOutput.Text = result.ToString(CultureInfo.InvariantCulture);
}
private int Calculate()
{
Thread.Sleep(2000); //--similate working....
return Environment.TickCount ^ 43;
}
我正在玩异步操作,我现在的目标很简单。我只想在大型计算开始时更新文本字段,而我面临的问题是文本字段得到更新,但仅在 calculate()
returns 时更新,即使方法 computingMessage()
立即调用:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
annunciate();
calculate();
}
private void annunciate(){
Thread updateUI = new Thread( new ThreadStart( computingMessage ));
updateUI.Start();
}
private void computingMessage(){
txtVerification.Dispatcher.Invoke((Action)(
() => txtVerification.Text = "Calculating..."
));
}
请检查 Task 对象。
private void Button_Click(object sender, RoutedEventArgs e)
{
TextBoxOutput.Text = "calculating...";
Task.Factory
.StartNew(() => Calculate())
.ContinueWith(t =>
{
TextBoxOutput.Text = t.Result.ToString(CultureInfo.InvariantCulture);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
private int Calculate()
{
Thread.Sleep(2000); //--similate working....
return Environment.TickCount ^ 43;
}
希望对你有所帮助
虽然我在精神上同意@dbvega。我不同意 Task.Factory.StartNew
的用法。你也不应该使用 Dispatcher.Invoke
。默认情况下,当 运行 WPF 时,Task.Factory.CurrentScheduler
将设置为 WPF 消息泵调度程序。 运行WinForms时,有一个自动设置的WinForm调度器...
private async void Button_Click(object sender, RoutedEventArgs e)
{
TextBoxOutput.Text = "calculating...";
var result = await Task.Run(Calculate);
TextBoxOutput.Text = result.ToString(CultureInfo.InvariantCulture);
}
private int Calculate()
{
Thread.Sleep(2000); //--similate working....
return Environment.TickCount ^ 43;
}