繁体   English   中英

Windows Phone 8 RestSharp请求。 异步/等待

[英]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构造函数时,我异步尝试从Web服务器请求数据并填充模型。 关键是,相应的视图“不等待”填充模型的请求,因此显示为空。 我用

List<AlphaKeyGroup<Deck>> DataSource 

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

您正在调用异步方法,而无需在构造函数中等待它。 这就是为什么“它不等待”的原因(因为它没有什么可以等待的)。

因此,在构造函数内部调用async方法通常是一个坏主意,同时考虑到构造函数无法async的事实。

您应该相应地重新设计解决方案。 一种选择是拥有一个async静态方法,该方法创建一个实例并await该过程:

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

那将允许您不使用仅在UI甚至处理程序中使用的async void

您可以在Stephen Cleary的博客中了解其他选项的更多信息

您正在使用async void ,这意味着没有人会等待。 只是失火而忘记

我在这里的async关键字中看到一些误解:如果使用await,您的代码将仅等待async方法的结果。 否则,该调用将仅启动async方法,但您不知道它何时真正运行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM