一尘不染

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

c#

摘要 :我想在构造函数中调用异步方法。这可能吗?

详细信息
:我有一个称为getwritings()JSON数据解析的方法。如果我只是调用getwritings()一个async方法并将其放在await左边,那么一切都会正常运行。但是,当我LongListView在页面中创建一个并尝试填充它时,我发现getWritings()返回的结果令人惊讶null,并且LongListView为空。

为了解决这个问题,我试图改变的返回类型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;
    }
}

阅读 854

收藏
2020-05-19

共1个答案

一尘不染

最好的解决方案是承认下载和下载设计的异步性。

换句话说,确定数据下载时应用程序的外观。让页面构造函数设置 视图,然后开始下载。下载完成后, 更新 页面以显示数据。

我有一篇关于异步构造函数的博客文章,您可能会觉得有用。另外,一些MSDN文章;一种是关于异步数据绑定(如果您使用的是MVVM),另一种是关于异步最佳实践的(即,应避免使用async void)。

2020-05-19