diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatcherQueueProgress.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatcherQueueProgress.cs index d6869b52..84bb5114 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatcherQueueProgress.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatcherQueueProgress.cs @@ -1,45 +1,24 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Microsoft.UI.Dispatching; + namespace Snap.Hutao.Core.Threading; internal class DispatcherQueueProgress : IProgress { - private readonly SynchronizationContext synchronizationContext; - private readonly Action? handler; - private readonly SendOrPostCallback invokeHandlers; + private readonly DispatcherQueue dispatcherQueue; + private readonly Action handler; - public DispatcherQueueProgress(Action handler, SynchronizationContext synchronizationContext) + public DispatcherQueueProgress(Action handler, DispatcherQueue dispatcherQueue) { - this.synchronizationContext = synchronizationContext; - invokeHandlers = new SendOrPostCallback(InvokeHandlers); - - ArgumentNullException.ThrowIfNull(handler); - + this.dispatcherQueue = dispatcherQueue; this.handler = handler; } - public event EventHandler? ProgressChanged; - public void Report(T value) { - Action? handler = this.handler; - EventHandler? changedEvent = ProgressChanged; - if (handler is not null || changedEvent is not null) - { - synchronizationContext.Post(invokeHandlers, value); - } - } - - [SuppressMessage("", "SH007")] - private void InvokeHandlers(object? state) - { - T value = (T)state!; - - Action? handler = this.handler; - EventHandler? changedEvent = ProgressChanged; - - handler?.Invoke(value); - changedEvent?.Invoke(this, value); + Action handler = this.handler; + dispatcherQueue.TryEnqueue(() => handler(value)); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContext.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContext.cs index 1a52c409..06579385 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContext.cs @@ -8,8 +8,6 @@ namespace Snap.Hutao.Core.Threading; /// internal interface ITaskContext { - SynchronizationContext SynchronizationContext { get; } - void BeginInvokeOnMainThread(Action action); void InvokeOnMainThread(Action action); diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContextUnsafe.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContextUnsafe.cs new file mode 100644 index 00000000..04bf3a4d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/ITaskContextUnsafe.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Dispatching; + +namespace Snap.Hutao.Core.Threading; + +internal interface ITaskContextUnsafe +{ + DispatcherQueue DispatcherQueue { get; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskContext.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskContext.cs index 32b133ed..289bdbd0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskContext.cs @@ -9,7 +9,7 @@ namespace Snap.Hutao.Core.Threading; /// 任务上下文 /// [Injection(InjectAs.Singleton, typeof(ITaskContext))] -internal sealed class TaskContext : ITaskContext +internal sealed class TaskContext : ITaskContext, ITaskContextUnsafe { private readonly DispatcherQueueSynchronizationContext synchronizationContext; private readonly DispatcherQueue dispatcherQueue; @@ -24,7 +24,7 @@ internal sealed class TaskContext : ITaskContext SynchronizationContext.SetSynchronizationContext(synchronizationContext); } - public SynchronizationContext SynchronizationContext { get => synchronizationContext; } + public DispatcherQueue DispatcherQueue { get => dispatcherQueue; } /// public ThreadPoolSwitchOperation SwitchToBackgroundAsync()