如何在异步HttpRequest完成后更新TextBlock?

时间:2013-07-06 11:21:49

标签: c# windows-phone-7 asynchronous windows-phone-8

我正在开发一款应用,我正在重构我的代码。

在我的MainPage.xaml.cs上,我有一个TextBlock和一个ListBox。我有单独的文件(Info.cs)来处理HttpRequest以获取我需要加载的信息。

Info.cs中的HttpRequest从天气API获取信息。当它获取所有信息时,它将信息放入ObservableCollection中。此ObservableCollection绑定到ListBox。

现在,我想在HttpRequest完成时更新TextBlock,以向用户显示已加载所有信息。

我怎样才能做到这一点?

MainPage.xaml.cs中:

        WeatherInfo weatherInfo = new WeatherInfo();
        weatherInfo.getTheWeatherData();

        DataContext = weatherInfo;
        WeatherListBox.ItemsSource = weatherInfo.ForecastList;

        StatusTextBlock.Text = "Done.";

在Info.cs中,我有一个Dispatcher来填充ForecastList:

    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        ForecastList.Clear();
        ForecastList = outputList;    
    }

现在发生的事情是TextBlock立即变为“完成!” (doh,它的异步!)但我怎么能改变这个?所以它等待ListBox更新?不幸的是,Windows Phone中没有'ItemsSourceChanged'事件。

1 个答案:

答案 0 :(得分:1)

我建议使用C#5.0中新的async + await功能。这实际上是在WP8中使用async programming的好方法。

假设您已控制getTheWeatherData()方法,并且可以将其标记为返回async的{​​{1}}方法,则可以使用Task修饰符调用它

await不会阻止用户界面,只会在任务完成后才会执行下一个代码行。

await

修改 WeatherInfo weatherInfo = new WeatherInfo(); await weatherInfo.getTheWeatherData(); DataContext = weatherInfo; WeatherListBox.ItemsSource = weatherInfo.ForecastList; StatusTextBlock.Text = "Done."; 以及WP 8WP 7.5 Nuget Package

支持此功能

如果不能选择异步编程, 您始终可以在Microsoft.Bcl.Async类中创建一个回调event,该回调将在WeatherInfo内发出信号,并在用户界面上注册。

一个选项如下:

getTheWeatherData()

两个public static void DoWork(Action processAction) { // do work if (processAction != null) processAction(); } public static void Main() { // using anonymous delegate DoWork(delegate() { Console.WriteLine("Completed"); }); // using Lambda DoWork(() => Console.WriteLine("Completed")); } 调用都将以调用作为参数传递的回调结束。