Windows phone 8 个 RestSharp 请求。 Async/await

Windows phone 8 RestSharp request. Async/await

我知道它被问了很多,但我的问题是,我的方法不会等待请求完成,即使我已经实现了一个 TaskCompletionSource,它应该已经完成​​了工作,但是它没有。

public DecksViewModel(bool local)
{
    DList = new List<Deck>();

    if (local)
        InitializeLocalDeckList();
    else
    {
        Dereffering();
    }
}

public async void Dereffering()
{
    var e = await InitilaizeWebDeckList();
    List<DeckIn> decksIn = JsonConvert.DeserializeObject<List<DeckIn>>(e);
    foreach (DeckIn d in decksIn)
    {
        Deck dadd = new Deck();
        dadd.CardCount = 0;
        dadd.Name = d.name;
        dadd.PicturePath = d.image;
        dadd.InstallDirectory = false;
        DList.Add(dadd);
    }

    DataSource = AlphaKeyGroup<Deck>.CreateGroups(DList, System.Threading.Thread.CurrentThread.CurrentUICulture, (Deck s) => { return s.Name; }, true);
}

public Task<String> InitilaizeWebDeckList()
{
    var tcs = new TaskCompletionSource<string>();
    var client = new RestClient("blabla.com");
    var request = new RestRequest("");
    request.AddHeader("Authorization", "Basic blabla");
    client.ExecuteAsync(request, response =>
    {
        test = response.Content;
        tcs.SetResult(response.Content);


    });
    return tcs.Task;
}

因此,当我调用 DecksViewModel 构造函数时,我异步尝试从网络服务器请求数据并填充模型。 关键是,填充模型的请求对应的视图"doesn't wait",所以它显示为空。 我用

List<AlphaKeyGroup<Deck>> DataSource 

通过 DataBinding 填充 LongListSelector。但是 DataSource 在绑定时尚未设置。 希望能帮到你

您正在调用一个异步方法,而没有在构造函数中等待它。这就是为什么 "it doesn't wait"(因为它没有什么可等待的)。

由于这个原因,再加上构造函数不能 async.

,在构造函数中调用 async 方法通常不是一个好主意

您应该相应地重新设计您的解决方案。一个选项是使用 async 创建实例的静态方法和 await 过程:

public static async Task CreateInstance(bool local)
{
    var model = new DecksViewModel();
    if (local)
    {
        await InitializeLocalDeckList();
    }
    else
    {
        await Dereffering();
    }
}

这将允许您不使用 async void,它只应在 UI 偶数处理程序中使用。

您可以在 Stephen Cleary's blog

中阅读更多关于其他选项的信息

您正在使用 async void,这意味着没有人会等待它。只是 即刻忘记

我发现这里的 async 关键字存在一些误解: 如果您使用 await,您的代码将只等待异步方法的结果。否则那个调用只会启动异步方法,但你不知道它什么时候真正会 运行.

但是您不能在构造函数中使用 await。