[c#] ¿Llamar al método asincrónico en el constructor?



Answers

También puede hacer simplemente así:

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

Resumen : me gustaría llamar a un método asincrónico en un constructor. es posible?

Detalles : Tengo un método llamado getwritings() que analiza datos JSON. Todo funciona bien si solo llamo a getwritings() en un método async y lo pongo a la izquierda. Sin embargo, cuando creo un LongListView en mi página y trato de poblarlo, me getWritings() que getWritings() sorprendentemente devuelve null y LongListView está vacío.

Para resolver este problema, traté de cambiar el tipo de retorno de getWritings() a la Task<List<Writing>> y luego recuperar el resultado en el constructor a través de getWritings().Result . Sin embargo, hacer eso termina bloqueando el hilo de 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;
    }
}



Intenta reemplazar esto:

myLongList.ItemsSource = writings;

con este

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



Para decirlo simplemente, refiriéndose a Stephen Cleary https://.com/a/23051370/267000

su página de creación debe crear tareas en el constructor y debe declarar esas tareas como miembros de la clase o colocarla en su grupo de tareas.

Sus datos se obtienen durante estas tareas, pero estas tareas deben esperar en el código, es decir, en algunas manipulaciones de la interfaz de usuario, es decir, haga clic en Aceptar, etc.

Desarrollé tales aplicaciones en WP, tuvimos un montón de tareas creadas desde el principio.




Links