public async Task ExecuteTaskAsync(Func <CancellationToken, Task> action, bool notifySuccess, bool preventCancellation) { _ = action ?? throw new ArgumentNullException(nameof(action)); await _cancellationTokenSourceProvider.ExecuteAsyncOperation( async cancellationToken => await Task.Run( async() => { if (preventCancellation) { _messageHub.Publish(CancellationState.Forbidden); } _messageHub.Publish(TaskState.Started); try { await action(cancellationToken).ConfigureAwait(false); if (notifySuccess) { _messageHub.Publish("Task has been executed successfully!".ToSuccess()); } _messageHub.Publish(TaskState.Finished); } catch (Exception ex) { _messageHub.Publish(ex.ToMessage()); _messageHub.Publish(TaskState.Error); } finally { _messageHub.Publish(CancellationState.Allowed); } }, cancellationToken) .ConfigureAwait(false)) .ConfigureAwait(false); }