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());
}