异步、等待和奇怪的结果

本文关键字:结果 等待 异步 | 更新日期: 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 Taskawait 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一个异步方法,程序会执行它,并在不等待它完成的情况下继续执行下面的代码。