using Microsoft.UI.Dispatching; namespace FluidExplorer.Helpers; /// DispatcherQueue 的 await 化封装:把 UI 线程更新变成可等待的操作,便于批量提交与顺序保证。 public static class DispatcherQueueExtensions { public static Task EnqueueAsync(this DispatcherQueue queue, Action action) { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); if (!queue.TryEnqueue(() => { try { action(); tcs.TrySetResult(); } catch (Exception ex) { tcs.TrySetException(ex); } })) { tcs.TrySetException(new InvalidOperationException("DispatcherQueue 已关闭,无法调度到 UI 线程。")); } return tcs.Task; } public static Task EnqueueAsync(this DispatcherQueue queue, Func func) { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); if (!queue.TryEnqueue(() => { try { tcs.TrySetResult(func()); } catch (Exception ex) { tcs.TrySetException(ex); } })) { tcs.TrySetException(new InvalidOperationException("DispatcherQueue 已关闭,无法调度到 UI 线程。")); } return tcs.Task; } /// 即发即忘的 UI 调度(不需要等待结果的场合)。 public static void Post(this DispatcherQueue queue, Action action) => queue.TryEnqueue(() => action()); }