private async Task WatchTaskAsync(Task task)
        {
            await task;

            var handler = PropertyChanged;

            if (handler == null)
            {
                return;
            }

            void Notify(string propertyName) => handler(this, PropertyChangedEventArgsCache.GetEventArgs(propertyName));

            Notify(nameof(Status));
            Notify(nameof(IsCompleted));
            Notify(nameof(IsNotCompleted));

            if (task.IsCanceled)
            {
                Notify(nameof(IsCanceled));
            }
            else if (task.IsFaulted)
            {
                Notify(nameof(IsFaulted));
                Notify(nameof(Exception));
                Notify(nameof(InnerException));
                Notify(nameof(ErrorMessage));
            }
            else
            {
                Notify(nameof(IsSuccessfullyCompleted));
                Notify(nameof(Result));
            }
        }
        protected void PropertyChanged(string propertyName)
        {
            PropertyChangedEventArgs eventArgs = PropertyChangedEventArgsCache.GetEventArgs(propertyName);

            _propertyChangedHandler?.Invoke(this, eventArgs);
        }