c# - 在构造函数中调用异步方法?

标签 c# windows-phone-8 constructor visual-studio-2013 async-await

总结:我想在构造函数中调用一个异步方法。这可能吗?

详细信息:我有一个名为 getwritings() 的方法解析 JSON 数据。如果我调用 getwritings() 一切正常在async方法并放置 await在它的左边。但是,当我创建 LongListView在我的页面中尝试填充它我发现 getWritings()出人意料地回归 nullLongListView是空的。

为了解决这个问题,我尝试更改 getWritings() 的返回类型至 Task<List<Writing>>然后通过 getWritings().Result 在构造函数中检索结果.但是,这样做最终会阻塞 UI 线程。

public partial class Page2 : PhoneApplicationPage
{
    List<Writing> writings;

    public Page2()
    {
        InitializeComponent();
        getWritings();
    }

    private async void getWritings()
    {
        string jsonData = await JsonDataManager.GetJsonAsync("1");
        JObject obj = JObject.Parse(jsonData);
        JArray array = (JArray)obj["posts"];

        for (int i = 0; i < array.Count; i++)
        {
            Writing writing = new Writing();
            writing.content = JsonDataManager.JsonParse(array, i, "content");
            writing.date = JsonDataManager.JsonParse(array, i, "date");
            writing.image = JsonDataManager.JsonParse(array, i, "url");
            writing.summary = JsonDataManager.JsonParse(array, i, "excerpt");
            writing.title = JsonDataManager.JsonParse(array, i, "title");

            writings.Add(writing);
        }

        myLongList.ItemsSource = writings;
    }
}

最佳答案

最好的解决方案是承认下载的异步性质并针对它进行设计。

换句话说,决定您的应用程序在下载数据时应该是什么样子。让页面构造器设置那个 View ,然后开始下载。下载完成后,更新页面以显示数据。

我在 asynchronous constructors 上有一篇博文你可能会觉得有用。另外,一些 MSDN 文章;一个在 asynchronous data-binding (如果你使用 MVVM)和另一个 asynchronous best practices (即,您应该避免使用 async void)。

关于c# - 在构造函数中调用异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048285/

相关文章:

c# - 带有数据源和组合框的数据 GridView

c# - Math.Round(1.225,2) 给出 1.23,它不应该给出 1.22

c# - C# 中异常的高阶函数方法

windows-phone-8 - window 电话 8 : dllimport does not work

html - 在表格行上滚动不平滑 - Windows Phone

c++ 对象初始化和构造函数语义

c# - 绑定(bind)、线程和 winforms

javascript - 为什么我需要为扩展函数设置构造函数?

c# - 子级完全初始化后如何执行基类中的方法?

c# - Windows Phone 后退按钮