通知任务完成

时间:2020-01-30 08:00:39

标签: c# asynchronous mvvm

我有一个要在异步操作中运行的Httprequest,并且我正在使用MVVM,因此我试图单击按钮以在我的视图模型中启动异步操作,并以此为准阅读本文{ {3}}。

在本文中,作者使用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;
}

我真的不了解它,第一件事是它告诉我在Watchtaskasync方法的调用中使用await第二件事是我不知道我是否应该将此按钮用作按钮提示,在这种情况下如何?

这是我的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
        }    
    }
}

0 个答案:

没有答案
相关问题