4using System.Threading.Tasks;
5using CommunityToolkit.Mvvm.Input;
15 private Func<TaskContext<TProgress>, Task>? factory;
27 if (this.factory is
null)
28 throw new InvalidOperationException(
"Factory not set.");
30 Func<TaskContext<TProgress>, Task> Wrapped = async ctx =>
32 System.Diagnostics.Stopwatch Sw =
System.Diagnostics.Stopwatch.StartNew();
36 Func<CancellationToken, Task> Core =
39 Func<CancellationToken, Task> Pipeline = Core;
41 foreach (
IAsyncPolicy? Policy
in Enumerable.Reverse(
this.options.Policies))
43 Func<CancellationToken, Task> Next = Pipeline;
44 Pipeline = ct => Policy.ExecuteAsync(Next, ct);
47 await Pipeline(ctx.CancellationToken);
48 this.options.Telemetry?.OnEvent(
new(this.options.Name,
ObservableTaskStatus.Succeeded, Sw.Elapsed,
null, ctx.IsRefreshing));
50 catch (OperationCanceledException oce) when (ctx.CancellationToken.IsCancellationRequested)
52 this.options.Telemetry?.OnEvent(
new(this.options.Name,
ObservableTaskStatus.Canceled, Sw.Elapsed, oce, ctx.IsRefreshing));
57 this.options.Telemetry?.OnEvent(
new(this.options.Name,
ObservableTaskStatus.Failed, Sw.Elapsed, ex, ctx.IsRefreshing));
65 UseTaskRun = this.options.UseTaskRun,
66 Dispatcher = this.options.Dispatcher ?? UiDispatcher.Instance
74 if (Policy is IDisposable d)
75 Task.AttachDisposable(d);
78 if (this.options.AutoStart)
Provides a data-binding friendly mechanism to manage and report the status of asynchronous operations...
void Configure(Func< TaskContext< TProgress >, Task > task, params IRelayCommand[] notifyCommands)
Store the factory and optional commands without starting the task. Use Run or RunRefresh to start lat...
ObservableTaskStatus
UI-friendly status for an observable async operation. (Renamed to avoid collision with System....
class TaskContext< TProgress >(bool IsRefreshing, CancellationToken CancellationToken, IProgress< TProgress > Progress)
Represents the context for an asynchronous task execution.