NotifyTask завершение - PullRequest
       2

NotifyTask завершение

0 голосов
/ 30 января 2020

У меня есть Httprequest, который я хочу выполнить в асинхронной операции, и я использую MVVM, поэтому я пытаюсь получить нажатие кнопки, чтобы запустить асинхронное действие в моей модели представления, и с этим прочитайте эту статью об этом https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/march/async-programming-patterns-for-asynchronous-mvvm-applications-data-binding.

В этой статье автор использует метод NotifyTaskCompletion для придания асинхронной функции асинхронности в видоискателе. Я начал думать об этой части кода здесь

using System;
using System.ComponentModel;
using System.Threading.Tasks;

public sealed class NotifyTaskCompletion<TResult> : INotifyPropertyChanged
{
    public NotifyTaskCompletion(Task<TResult> task)
    {
        Task = task;

        if (!task.IsCompleted)
        {
            var _ = WatchTaskAsync(task);
        }
    }

    private async Task WatchTaskAsync(Task task)
    {
        try
        {
            await task;
        }
        catch
        {
        }

        var propertyChanged = PropertyChanged;

        if (propertyChanged == null)
            return;

        propertyChanged(this, new PropertyChangedEventArgs("Status"));
        propertyChanged(this, new PropertyChangedEventArgs("IsCompleted"));
        propertyChanged(this, new PropertyChangedEventArgs("IsNotCompleted"));

        if (task.IsCanceled)
        {
            propertyChanged(this, new PropertyChangedEventArgs("IsCanceled"));
        }
        else if (task.IsFaulted)
        {
            propertyChanged(this, new PropertyChangedEventArgs("IsFaulted"));
            propertyChanged(this, new PropertyChangedEventArgs("Exception"));
            propertyChanged(this, new PropertyChangedEventArgs("InnerException"));
            propertyChanged(this, new PropertyChangedEventArgs("ErrorMessage"));
        }
        else
        {
            propertyChanged(this, new PropertyChangedEventArgs("IsSuccessfullyCompleted"));
            propertyChanged(this, new PropertyChangedEventArgs("Result"));
        }
    }

    public Task<TResult> Task { get; private set; }
    public TResult Result { get { return (Task.Status == TaskStatus.RanToCompletion) ? Task.Result : default(TResult); } }
    public TaskStatus Status { get { return Task.Status; } }
    public bool IsCompleted { get { return Task.IsCompleted; } }
    public bool IsNotCompleted { get { return !Task.IsCompleted; } }
    public bool IsSuccessfullyCompleted { get { return Task.Status == TaskStatus.RanToCompletion; } }
    public bool IsCanceled { get { return Task.IsCanceled; } }
    public bool IsFaulted { get { return Task.IsFaulted; } }
    public AggregateException Exception { get { return Task.Exception; } }
    public Exception InnerException { get { return (Exception == null) ? null : Exception.InnerException; } }
    public string ErrorMessage { get { return (InnerException == null) ? null : InnerException.Message; } }
    public event PropertyChangedEventHandler PropertyChanged;
}

И я действительно не понял этого, во-первых, для меня это говорит мне использовать await при вызове метода Watchtaskasync, во-вторых, Я не знаю, должен ли я использовать это для запроса кнопки, и в таком случае как?

Это мой ViewHandler

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
using System.Threading;
using System.Threading.Tasks;

namespace API
{
    public class ApiViewModel : BaseViewModel
    {
        #region Public Properties
        public bool CustomerIsChecked { get; set;}
        public bool ArticlesIsChecked { get; set; }
        public bool StorageIsChecked { get; set; }

        public string endResult { get; set;}

        #endregion

        #region Private properties
        private CustomerRoot customer = new CustomerRoot();
        #endregion

        #region Public Commands
        public ICommand TransferCommand { get; set;}
        #endregion

        public ApiViewModel()
        {
             this.TransferCommand = new RelayCommand(Transfer);
        }

        private Transfer(){
           Code that is supposed to run
        }    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...