C# Ожидание завершения всех задач Asyn c при вызове из неасинхронного c метода - PullRequest
1 голос
/ 04 августа 2020

У меня есть следующий код в моем конструкторе для проекта Xamarin Forms - я хочу, чтобы каждый шаг завершался (в основном это загрузка данных из веб-службы) перед вызовом метода ShowPage () - будет ли это работать или есть лучший способ для этого?

public MyTabbedPage()
 {
    ....
     Task.Run(async () => await vm1.LoadData();
     Task.Run(async () => await vm2.LoadData();
     Task.Run(async () => await vm3.LoadData();

     ShowPage();
     ....
 } ```

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Неправильный вызов задачи asyn c в синхронной функции может вызвать проблемы c, поскольку он подавляет детали, если в задаче возникает исключение. Следовательно, важно правильно реализовать эту распространенную проблему.

Вы можете использовать FireAndForget помощник, расположенный внутри вашей папки Helpers в TaskHelpers.cs, определенный следующим образом:

    public static async void FireAndForgetSafeAsync(this Task task, Action<Exception> handleErrorAction = null)
    {
        try
        {
            await task.ConfigureAwait(true);
        }
        catch (Exception ex)
        {
            handleErrorAction?.Invoke(ex);
        }
    }

Затем вернитесь назад в своем конструкторе вы можете сделать это:

 public MyTabbedPage()
 {
     vm1.LoadData().FireAndForgetSafeAsync(HandleErrorInternal);
     vm2.LoadData().FireAndForgetSafeAsync(HandleErrorInternal);
     vm3.LoadData().FireAndForgetSafeAsync(HandleErrorInternal);
     ShowPage();
 }

 private void HandleErrorInternal(Exception ex)
 {
     DisplayAlertAsync("Error", ex.ToString(), "OK").FireAndForgetSafeAsync(HandleErrorInternal);
 }
0 голосов
/ 04 августа 2020

Всегда старайтесь избегать загрузки данных в конструктор. Просто хорошая практика. Поместите его в метод OnAppearing и измените на asyn c.

        protected override async void OnAppearing()
    {
        await vm1.LoadData()
        await vm2.LoadData()
        await vm3.LoadData()
        base.OnAppearing();
    }
...