diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ThrottleHelper.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ThrottleHelper.cs
new file mode 100644
index 0000000..8321966
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ThrottleHelper.cs
@@ -0,0 +1,37 @@
+using System;
+
+namespace BetterLyrics.WinUI3.Helper
+{
+ public class ThrottleHelper
+ {
+ private DateTime _lastTriggerTime = DateTime.MinValue;
+ private readonly TimeSpan _interval;
+
+ public ThrottleHelper(TimeSpan interval)
+ {
+ _interval = interval;
+ }
+
+ ///
+ /// 判断是否可以触发(距离上次触发已超过设定间隔),如果可以则更新时间戳并返回 true,否则返回 false。
+ ///
+ public bool CanTrigger()
+ {
+ var now = DateTime.Now;
+ if ((now - _lastTriggerTime) >= _interval)
+ {
+ _lastTriggerTime = now;
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ /// 重置触发时间
+ ///
+ public void Reset()
+ {
+ _lastTriggerTime = DateTime.MinValue;
+ }
+ }
+}
\ No newline at end of file
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs
index 8fcd7d4..a276d50 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs
@@ -69,9 +69,7 @@ namespace BetterLyrics.WinUI3.Services
private void OnChanged(string folder, FileSystemEventArgs e)
{
- App.DispatcherQueue!.TryEnqueue(
- Microsoft.UI.Dispatching.DispatcherQueuePriority.High,
- () =>
+ App.DispatcherQueue!.TryEnqueue(() =>
{
MusicLibraryFilesChanged?.Invoke(
this,
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs
index 9061620..d2768c6 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs
@@ -110,9 +110,7 @@ namespace BetterLyrics.WinUI3.Services
{
if (!IsMediaSourceEnabled(mediaSession.ControlSession.SourceAppUserModelId) || mediaSession != _mediaManager.GetFocusedSession()) return;
- _dispatcherQueue.TryEnqueue(
- DispatcherQueuePriority.High,
- () =>
+ _dispatcherQueue.TryEnqueue(() =>
{
PositionChanged?.Invoke(this, new PositionChangedEventArgs(timelineProperties.Position));
}
@@ -130,8 +128,7 @@ namespace BetterLyrics.WinUI3.Services
_ => false,
};
- _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.High,
- () =>
+ _dispatcherQueue.TryEnqueue(() =>
{
IsPlayingChanged?.Invoke(this, new IsPlayingChangedEventArgs(_cachedIsPlaying));
}
@@ -218,8 +215,7 @@ namespace BetterLyrics.WinUI3.Services
{
_mediaSourceProvidersInfo.Add(new MediaSourceProviderInfo(id, true));
_settingsService.MediaSourceProvidersInfo = _mediaSourceProvidersInfo;
- _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.High,
- () =>
+ _dispatcherQueue.TryEnqueue(() =>
{
MediaSourceProvidersInfoChanged?.Invoke(this, new MediaSourceProvidersInfoEventArgs(_mediaSourceProvidersInfo));
});
@@ -228,8 +224,7 @@ namespace BetterLyrics.WinUI3.Services
private void SendNullMessages()
{
- _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.High,
- () =>
+ _dispatcherQueue.TryEnqueue(() =>
{
_cachedSongInfo = null;
_cachedIsPlaying = false;
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/BaseViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/BaseViewModel.cs
index 3c1e280..253c9c5 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/BaseViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/BaseViewModel.cs
@@ -7,22 +7,20 @@ using Microsoft.UI.Dispatching;
namespace BetterLyrics.WinUI3.ViewModels
{
- public partial class BaseViewModel : ObservableRecipient, IDisposable
+ public partial class BaseViewModel : ObservableRecipient
{
- private protected readonly DispatcherQueue _dispatcherQueue =
- DispatcherQueue.GetForCurrentThread();
+ private protected readonly DispatcherQueue _dispatcherQueue;
+
+ private protected readonly DispatcherQueueTimer _dispatcherQueueTimer;
private protected readonly ISettingsService _settingsService;
public BaseViewModel(ISettingsService settingsService)
{
IsActive = true;
+ _dispatcherQueue = DispatcherQueue.GetForCurrentThread();
+ _dispatcherQueueTimer = _dispatcherQueue.CreateTimer();
_settingsService = settingsService;
}
-
- public void Dispose()
- {
- GC.SuppressFinalize(this);
- }
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs
index f765226..b7eaa56 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs
@@ -9,6 +9,7 @@ using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
+using CommunityToolkit.WinUI;
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml;
using System;
@@ -24,6 +25,7 @@ namespace BetterLyrics.WinUI3.ViewModels
IRecipient>
{
private readonly IPlaybackService _playbackService;
+ private readonly ThrottleHelper _timelineThrottle = new(TimeSpan.FromSeconds(1));
public LyricsPageViewModel(ISettingsService settingsService, IPlaybackService playbackService) : base(settingsService)
{
@@ -256,10 +258,13 @@ namespace BetterLyrics.WinUI3.ViewModels
{
if (message.PropertyName == nameof(LyricsRendererViewModel.TotalTime))
{
- _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
+ if (_timelineThrottle.CanTrigger())
{
- TimelinePositionSeconds = message.NewValue.TotalSeconds;
- });
+ _dispatcherQueue.TryEnqueue(() =>
+ {
+ TimelinePositionSeconds = message.NewValue.TotalSeconds;
+ });
+ }
}
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs
index bbb6fd9..7510daa 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs
@@ -102,7 +102,7 @@ namespace BetterLyrics.WinUI3.ViewModels
Task.Run(async () =>
{
- BuildDate = (await Helper.MetadataHelper.GetBuildDate()).ToString("(yyyy/MM/dd HH:mm:ss)");
+ BuildDate = (await MetadataHelper.GetBuildDate()).ToString("(yyyy/MM/dd HH:mm:ss)");
});
}
@@ -258,7 +258,7 @@ namespace BetterLyrics.WinUI3.ViewModels
public partial int LyricsVerticalEdgeOpacity { get; set; }
[ObservableProperty]
- public partial object NavViewSelectedItemTag { get; set; }
+ public partial object NavViewSelectedItemTag { get; set; } = "App";
[ObservableProperty]
[NotifyPropertyChangedRecipients]