我正在开发一款应用,我正在重构我的代码。
在我的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'事件。
答案 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 8
到WP 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"));
}
调用都将以调用作为参数传递的回调结束。