异步更新 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;
}