异步、等待和奇怪的结果
本文关键字:结果 等待 异步 | 更新日期: 2023-09-27 18:24:35
我正在为WP 8.1编写应用程序。我的一个方法是解析html,一切都很好。但我想更改编码,使其具有润色字符。所以我必须将Length属性设置为变量类型byte[]。为了实现这一点,我需要使用wait并在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个元素。
现在是我的问题。为什么是vm。TimeTableCollection为null?
因为您在执行async
操作时没有await
。因此,当您在下一行访问vm
属性时,请求可能不完整。
您需要将方法签名更改为async Task
和await
it:
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);
这意味着您的顶级调用方法也必须变成异步的。这通常是处理异步方法时的行为,您需要一直执行异步。
注意,为了遵循TPL指南,您应该用Async
后缀标记任何async
方法,因此GetTimeTable
应该是GetTimeTableAsync
您没有等待结果:
await vm.GetTimeTable(navContext.HrefValue, pivot.SelectedIndex);
TimeTableViewOnPage.DataContext = vm.TimeTableCollection;
如果你不await
一个异步方法,程序会执行它,并在不等待它完成的情况下继续执行下面的代码。