У меня есть 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
}
}
}