我正在WP 8.1上编写应用程序。我的一个方法是解析html,一切都很好。但是我想改变编码以使用波兰字符。 所以我必须将Length属性设置为变量类型byte []。为了实现这一点,我需要使用等待并在 asnych 上更改我的方法。
public async void GetTimeTable(string href, int day)
{
string htmlPage = string.Empty;
using (var client = new HttpClient())
{
var response = await client.GetByteArrayAsync(URL);
char[] decoded = new char[response.Length];
for (int i = 0; i < response.Length; i++)
{
if (response[i] < 128)
decoded[i] = (char)response[i];
else if (response[i] < 0xA0)
decoded[i] = '\0';
else
decoded[i] = (char)iso8859_2[response[i] - 0xA0];
}
htmlPage = new string(decoded);
}
// further code... and on the end::
TimeTableCollection.Add(xxx);
}
public ObservableCollection<Groups> TimeTableCollection { get; set; }
方法是从MainPage.xaml.cs调用
vm.GetTimeTable(navContext.HrefValue, pivot.SelectedIndex);
TimeTableViewOnPage.DataContext = vm.TimeTableCollection;
现在是我的问题。为什么vm.TimeTableCollection为null?当我不使用async并等待一切正常时,vm.TimeTableCollection有x个元素。
答案 0 :(得分:1)
现在是我的问题。为什么vm.TimeTableCollection为null?
因为您在没有async
的情况下执行await
操作。因此,当您在下一行访问vm
属性时,请求可能无法完成。
您需要将方法签名更改为async Task
和await
:
public async Task GetTimeTableAsync(string href, int day)
{
string htmlPage = string.Empty;
using (var client = new HttpClient())
{
var response = await client.GetByteArrayAsync(URL);
char[] decoded = new char[response.Length];
for (int i = 0; i < response.Length; i++)
{
if (response[i] < 128)
decoded[i] = (char)response[i];
else if (response[i] < 0xA0)
decoded[i] = '\0';
else
decoded[i] = (char)iso8859_2[response[i] - 0xA0];
}
htmlPage = new string(decoded);
}
// further code... and on the end::
TimeTableCollection.Add(xxx);
}
然后:
await vm.GetTimeTableAsync(navContext.HrefValue, pivot.SelectedIndex);
这意味着您的顶级调用方法也必须变为异步。这通常是处理异步方法时的行为,您需要转到async all the way。
注意,要遵循TPL指南,您应使用async
后缀标记任何Async
方法,因此GetTimeTable
应为GetTimeTableAsync
答案 1 :(得分:0)
您还没有等待结果:
await vm.GetTimeTable(navContext.HrefValue, pivot.SelectedIndex);
TimeTableViewOnPage.DataContext = vm.TimeTableCollection;
如果你不是await
异步方法,程序将执行它,并继续执行以下代码而不等待它完成。