【问题标题】:Windows phone 8 RestSharp request. Async/awaitWindows phone 8 RestSharp 请求。异步/等待
【发布时间】:2015-01-20 22:42:39
【问题描述】:

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

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

List<AlphaKeyGroup<Deck>> DataSource 

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

【问题讨论】:

    标签: c# rest windows-phone-8 async-await restsharp


    【解决方案1】:

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

    在构造函数中调用 async 方法通常是个坏主意,因为这个原因再加上构造函数不能是 async 的事实。

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

    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阅读更多关于其他选项的信息

    【讨论】:

    • 谢谢,它可以工作,如果 Dereffering 返回 Task... 非常感谢
    【解决方案2】:

    您正在使用 async void,这意味着没有人会等待。这只是一劳永逸

    我看到这里的 async 关键字有一些误解: 如果您使用 await,您的代码只会等待异步方法的结果。否则,该调用只会启动异步方法,但您不知道它何时实际运行。

    你不能在构造函数中使用 await。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多