Приложение UWP падает при выполнении асинхронного метода - PullRequest
0 голосов
/ 11 января 2019

Я создал два метода в BaseViewModel (приложение MVVMLight) для выполнения любого асинхронного кода с некоторой логикой:

    public async Task PerformOperation(Func<Task> action)
    {
        IsBusy = true;

        try
        {
            await action?.Invoke();
        }
        catch(Exception ex)
        {
            // logging is here
        }
        finally
        {
            IsBusy = false;
        }
    }

    public async Task PerformOperation(params Operation[] actions)
    {
        IsBusy = true;
        MultipleOperatrions = true;
        OperationStatuses = new ObservableCollection<OperationStatus>();

        try
        {
            foreach(var action in actions)
            {
                var status = new OperationStatus() { StatusText = action.StatusText };
                OperationStatuses.Add(status);

                try
                {
                    await action?.AsyncAction();
                    status.Success = true;
                }
                catch
                {
                    status.Success = false;
                }
                finally
                {
                    status.IsFinished = true;
                }
            }
        }
        catch (Exception ex)
        {
            // logging is here
        }
        finally
        {
            await Task.Delay(1000);

            IsBusy = false;
            MultipleOperatrions = false;
            OperationStatuses = new ObservableCollection<OperationStatus>();
        }
    }

Мои модели:

public class Operation
{
    public Func<Task> AsyncAction { get; private set; }

    public string StatusText { get; private set; }

    public Operation(Func<Task> action, string statusText)
    {
        AsyncAction = action;
        StatusText = statusText;
    }
}

Мой код вызова методов в модели представления:

    ...
    private IAsyncCommand _buildCommand;
    public IAsyncCommand BuildCommand => _buildCommand ?? (_buildCommand = new AsyncCommand(Build));

    #endregion

    #region Methods

    public async Task Build()
    {
        // IT WORKS
        // this method is used for performing only a single operation
        // await PerformOperation(async () => { await Task.Delay(3000); });

        // IT CRASHES THE APP
        // for many tasks
        await PerformOperation(new Operation(async () => { await Task.Delay(3000); }, "Preparing..."));
    }
    ...

Итак, если я вызываю PerformOperation для вызова только одного метода - он работает нормально. Но это не для метода выполнения нескольких операций - приложение просто падает без каких-либо исключений или сообщений. Я подписался в App.cs на событие UnhandledException, чтобы поймать его, но приложение просто падает.

...