| File: AsyncTaskExtensions.cs | Web Access |
| Project: src\src\SingleProject\Resizetizer\src\Resizetizer.csproj (Microsoft.Maui.Resizetizer) |
// Based on: https://github.com/xamarin/xamarin-android-tools/blob/d92fc3e3a27e8240551baa813b15d6bf006a5620/src/Microsoft.Android.Build.BaseTasks/AsyncTaskExtensions.cs using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Microsoft.Maui.Resizetizer { public static class AsyncTaskExtensions { /// <summary> /// Calls Parallel.ForEach() with appropriate ParallelOptions and exception handling. /// </summary> public static ParallelLoopResult ParallelForEach<TSource>(this MauiAsyncTask asyncTask, IEnumerable<TSource> source, Action<TSource> body) { return Parallel.ForEach(source, ParallelOptions(asyncTask), s => { try { body(s); } catch (Exception exc) { asyncTask.LogCodedError("MAUI0000", exc.ToString()); asyncTask.Cancel(); } }); } static ParallelOptions ParallelOptions(MauiAsyncTask asyncTask) => new ParallelOptions { CancellationToken = asyncTask.CancellationToken, TaskScheduler = TaskScheduler.Default, }; /// <summary> /// Calls Task.Run() with a proper CancellationToken. /// </summary> public static Task RunTask(this MauiAsyncTask asyncTask, Action body) => Task.Run(body, asyncTask.CancellationToken); /// <summary> /// Calls Task.Run<T>() with a proper CancellationToken. /// </summary> public static Task<TSource> RunTask<TSource>(this MauiAsyncTask asyncTask, Func<TSource> body) => Task.Run(body, asyncTask.CancellationToken); } }