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]