异步更新UI

时间:2015-02-16 21:03:15

标签: c# wpf asynchronous

我正在玩异步操作,我现在的目标非常简单。我只是想在大型计算开始时更新文本字段,我面临的问题是文本字段会更新,但只有在calculate()返回时才会更新,即使方法{{1}立即调用:

computingMessage()

2 个答案:

答案 0 :(得分:3)

请检查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;
}

我希望它可以帮到你。

答案 1 :(得分:1)

虽然我同意@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;
}