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





3 Answers

你也可以这样做:

Task.Run(() => this.FunctionAsync()).Wait();
c# windows-phone-8 constructor visual-studio-2013 async-await

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

详细信息 :我有一个称为getwritings()的方法来分析JSON数据。 如果我只是在async方法中调用getwritings()并将其await到左边,那么一切正常。 然而,当我在我的页面中创建一个LongListView并尝试填充它时,我发现getWritings()出人意料地返回null ,并且LongListView是空的。

为了解决这个问题,我尝试将getWritings()的返回类型更改为Task<List<Writing>> ,然后通过getWritings().Result在构造函数中检索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;
    }
}



尝试替换这个:

myLongList.ItemsSource = writings;

有了这个

Dispatcher.BeginInvoke(() => myLongList.ItemsSource = writings);



简单来说,请参阅Stephen Cleary https://.com/a/23051370/267000

你的创建页面应该在构造函数中创建任务,并且你应该将这些任务声明为类成员或将其放入任务池中。

您的数据在这些任务期间被抓取,但是这些任务应该在代码中等待,即在一些UI操作上,即Ok点击等。

我在WP中开发了这样的应用程序,我们在开始时创建了大量任务。




Related