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





await用法 await详解 (6)


你可以试试AsyncMVVM

Page2.xaml:

<PhoneApplicationPage x:Class="Page2"
                      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <ListView ItemsSource="{Binding Writings}" />
</PhoneApplicationPage>

Page2.xaml.cs:

public partial class Page2
{
    InitializeComponent();
    DataContext = new ViewModel2();
}

ViewModel2.cs:

public class ViewModel2: AsyncBindableBase
{
    public IEnumerable<Writing> Writings
    {
        get { return Property.Get(GetWritingsAsync); }
    }

    private async Task<IEnumerable<Writing>> GetWritingsAsync()
    {
        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");
            yield return writing;
        }
    }
}

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

详细信息 :我有一个称为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;
    }
}



你也可以这样做:

Task.Run(() => this.FunctionAsync()).Wait();



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

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

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




尝试替换这个:

myLongList.ItemsSource = writings;

有了这个

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



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

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

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

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




确实使用base (something)来调用基类的构造函数,但是在重载的情况下使用this关键字

public ClassName() : this(par1,par2)
{
// do not call the constructor it is called in the this.
// the base key- word is used to call a inherited constructor   
} 

// Hint used overload as often as needed do not write the same code 2 or more times






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