Use Rx event subscription to replace MessageBus refresh configuration file function

This commit is contained in:
2dust 2025-08-29 14:46:08 +08:00
parent a108eaf34b
commit ea1d438e40
9 changed files with 59 additions and 75 deletions

View file

@ -5,6 +5,5 @@ public enum EMsgCommand
ClearMsg, ClearMsg,
SendMsgView, SendMsgView,
SendSnackMsg, SendSnackMsg,
RefreshProfiles,
AppExit AppExit
} }

View file

@ -0,0 +1,9 @@
using System.Reactive;
using System.Reactive.Subjects;
namespace ServiceLib.Handler;
public static class AppEvents
{
public static readonly Subject<Unit> ProfilesRefreshRequested = new();
}

View file

@ -260,7 +260,7 @@ public class MainWindowViewModel : MyReactiveObject
if (success) if (success)
{ {
var indexIdOld = _config.IndexId; var indexIdOld = _config.IndexId;
RefreshServers(); await RefreshServers();
if (indexIdOld != _config.IndexId) if (indexIdOld != _config.IndexId)
{ {
await Reload(); await Reload();
@ -350,9 +350,11 @@ public class MainWindowViewModel : MyReactiveObject
#region Servers && Groups #region Servers && Groups
private void RefreshServers() private async Task RefreshServers()
{ {
MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); AppEvents.ProfilesRefreshRequested.OnNext(Unit.Default);
await Task.Delay(200);
} }
private void RefreshSubscriptions() private void RefreshSubscriptions()
@ -384,7 +386,7 @@ public class MainWindowViewModel : MyReactiveObject
} }
if (ret == true) if (ret == true)
{ {
RefreshServers(); await RefreshServers();
if (item.IndexId == _config.IndexId) if (item.IndexId == _config.IndexId)
{ {
await Reload(); await Reload();
@ -399,11 +401,11 @@ public class MainWindowViewModel : MyReactiveObject
await _updateView?.Invoke(EViewAction.AddServerViaClipboard, null); await _updateView?.Invoke(EViewAction.AddServerViaClipboard, null);
return; return;
} }
int ret = await ConfigHandler.AddBatchServers(_config, clipboardData, _config.SubIndexId, false); var ret = await ConfigHandler.AddBatchServers(_config, clipboardData, _config.SubIndexId, false);
if (ret > 0) if (ret > 0)
{ {
RefreshSubscriptions(); RefreshSubscriptions();
RefreshServers(); await RefreshServers();
NoticeManager.Instance.Enqueue(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret)); NoticeManager.Instance.Enqueue(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret));
} }
else else
@ -449,11 +451,11 @@ public class MainWindowViewModel : MyReactiveObject
} }
else else
{ {
int ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false); var ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false);
if (ret > 0) if (ret > 0)
{ {
RefreshSubscriptions(); RefreshSubscriptions();
RefreshServers(); await RefreshServers();
NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedServerViaScan); NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedServerViaScan);
} }
else else
@ -532,7 +534,7 @@ public class MainWindowViewModel : MyReactiveObject
private async Task ClearServerStatistics() private async Task ClearServerStatistics()
{ {
await StatisticsManager.Instance.ClearAllServerStatistics(); await StatisticsManager.Instance.ClearAllServerStatistics();
RefreshServers(); await RefreshServers();
} }
private async Task OpenTheFileLocation() private async Task OpenTheFileLocation()

View file

@ -126,7 +126,7 @@ public class ProfilesViewModel : MyReactiveObject
this.WhenAnyValue( this.WhenAnyValue(
x => x.ServerFilter, x => x.ServerFilter,
y => y != null && _serverFilter != y) y => y != null && _serverFilter != y)
.Subscribe(c => ServerFilterChanged(c)); .Subscribe(async c => await ServerFilterChanged(c));
//servers delete //servers delete
EditServerCmd = ReactiveCommand.CreateFromTask(async () => EditServerCmd = ReactiveCommand.CreateFromTask(async () =>
@ -249,7 +249,10 @@ public class ProfilesViewModel : MyReactiveObject
if (_updateView != null) if (_updateView != null)
{ {
MessageBus.Current.Listen<string>(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext); AppEvents.ProfilesRefreshRequested
.AsObservable()
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(async _ => await RefreshServersBiz());//.DisposeWith(_disposables);
} }
_ = Init(); _ = Init();
@ -263,18 +266,13 @@ public class ProfilesViewModel : MyReactiveObject
SelectedServer = new(); SelectedServer = new();
await RefreshSubscriptions(); await RefreshSubscriptions();
RefreshServers(); await RefreshServers();
} }
#endregion Init #endregion Init
#region Actions #region Actions
private async void OnNext(string x)
{
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
}
private void Reload() private void Reload()
{ {
Locator.Current.GetService<MainWindowViewModel>()?.Reload(); Locator.Current.GetService<MainWindowViewModel>()?.Reload();
@ -353,12 +351,12 @@ public class ProfilesViewModel : MyReactiveObject
} }
_config.SubIndexId = SelectedSub?.Id; _config.SubIndexId = SelectedSub?.Id;
RefreshServers(); await RefreshServers();
await _updateView?.Invoke(EViewAction.ProfilesFocus, null); await _updateView?.Invoke(EViewAction.ProfilesFocus, null);
} }
private void ServerFilterChanged(bool c) private async Task ServerFilterChanged(bool c)
{ {
if (!c) if (!c)
{ {
@ -367,16 +365,18 @@ public class ProfilesViewModel : MyReactiveObject
_serverFilter = ServerFilter; _serverFilter = ServerFilter;
if (_serverFilter.IsNullOrEmpty()) if (_serverFilter.IsNullOrEmpty())
{ {
RefreshServers(); await RefreshServers();
} }
} }
public void RefreshServers() public async Task RefreshServers()
{ {
MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); AppEvents.ProfilesRefreshRequested.OnNext(Unit.Default);
await Task.Delay(200);
} }
public async Task RefreshServersBiz() private async Task RefreshServersBiz()
{ {
var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter); var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter);
_lstProfile = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(lstModel)) ?? []; _lstProfile = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(lstModel)) ?? [];
@ -395,6 +395,8 @@ public class ProfilesViewModel : MyReactiveObject
SelectedProfile = lstModel.First(); SelectedProfile = lstModel.First();
} }
} }
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
} }
public async Task RefreshSubscriptions() public async Task RefreshSubscriptions()
@ -514,7 +516,7 @@ public class ProfilesViewModel : MyReactiveObject
} }
if (ret == true) if (ret == true)
{ {
RefreshServers(); await RefreshServers();
if (item.IndexId == _config.IndexId) if (item.IndexId == _config.IndexId)
{ {
Reload(); Reload();
@ -541,7 +543,7 @@ public class ProfilesViewModel : MyReactiveObject
{ {
_profileItems.Clear(); _profileItems.Clear();
} }
RefreshServers(); await RefreshServers();
if (exists) if (exists)
{ {
Reload(); Reload();
@ -553,7 +555,7 @@ public class ProfilesViewModel : MyReactiveObject
var tuple = await ConfigHandler.DedupServerList(_config, _config.SubIndexId); var tuple = await ConfigHandler.DedupServerList(_config, _config.SubIndexId);
if (tuple.Item1 > 0 || tuple.Item2 > 0) if (tuple.Item1 > 0 || tuple.Item2 > 0)
{ {
RefreshServers(); await RefreshServers();
Reload(); Reload();
} }
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveDuplicateServerResult, tuple.Item1, tuple.Item2)); NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveDuplicateServerResult, tuple.Item1, tuple.Item2));
@ -568,7 +570,7 @@ public class ProfilesViewModel : MyReactiveObject
} }
if (await ConfigHandler.CopyServer(_config, lstSelected) == 0) if (await ConfigHandler.CopyServer(_config, lstSelected) == 0)
{ {
RefreshServers(); await RefreshServers();
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
} }
} }
@ -601,7 +603,7 @@ public class ProfilesViewModel : MyReactiveObject
if (await ConfigHandler.SetDefaultServerIndex(_config, indexId) == 0) if (await ConfigHandler.SetDefaultServerIndex(_config, indexId) == 0)
{ {
RefreshServers(); await RefreshServers();
Reload(); Reload();
} }
} }
@ -652,7 +654,7 @@ public class ProfilesViewModel : MyReactiveObject
} }
if (ret?.Data?.ToString() == _config.IndexId) if (ret?.Data?.ToString() == _config.IndexId)
{ {
RefreshServers(); await RefreshServers();
Reload(); Reload();
} }
else else
@ -675,13 +677,13 @@ public class ProfilesViewModel : MyReactiveObject
return; return;
} }
_dicHeaderSort[colName] = !asc; _dicHeaderSort[colName] = !asc;
RefreshServers(); await RefreshServers();
} }
public async Task RemoveInvalidServerResult() public async Task RemoveInvalidServerResult()
{ {
var count = await ConfigHandler.RemoveInvalidServerResult(_config, _config.SubIndexId); var count = await ConfigHandler.RemoveInvalidServerResult(_config, _config.SubIndexId);
RefreshServers(); await RefreshServers();
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count)); NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count));
} }
@ -702,7 +704,7 @@ public class ProfilesViewModel : MyReactiveObject
await ConfigHandler.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id); await ConfigHandler.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id);
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
RefreshServers(); await RefreshServers();
SelectedMoveToGroup = null; SelectedMoveToGroup = null;
SelectedMoveToGroup = new(); SelectedMoveToGroup = new();
} }
@ -723,7 +725,7 @@ public class ProfilesViewModel : MyReactiveObject
} }
if (await ConfigHandler.MoveServer(_config, _lstProfile, index, eMove) == 0) if (await ConfigHandler.MoveServer(_config, _lstProfile, index, eMove) == 0)
{ {
RefreshServers(); await RefreshServers();
} }
} }
@ -734,7 +736,7 @@ public class ProfilesViewModel : MyReactiveObject
{ {
if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0) if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0)
{ {
RefreshServers(); await RefreshServers();
} }
} }
} }

View file

@ -1,4 +1,5 @@
using System.Reactive; using System.Reactive;
using System.Reactive.Linq;
using System.Text; using System.Text;
using DynamicData.Binding; using DynamicData.Binding;
using ReactiveUI; using ReactiveUI;
@ -216,15 +217,13 @@ public class StatusBarViewModel : MyReactiveObject
_updateView = updateView; _updateView = updateView;
if (_updateView != null) if (_updateView != null)
{ {
MessageBus.Current.Listen<string>(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext); AppEvents.ProfilesRefreshRequested
.AsObservable()
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(async _ => await RefreshServersBiz()); //.DisposeWith(_disposables);
} }
} }
private async void OnNext(string x)
{
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
}
private async Task CopyProxyCmdToClipboard() private async Task CopyProxyCmdToClipboard()
{ {
var cmd = Utils.IsWindows() ? "set" : "export"; var cmd = Utils.IsWindows() ? "set" : "export";
@ -263,7 +262,7 @@ public class StatusBarViewModel : MyReactiveObject
await service.UpdateSubscriptionProcess("", blProxy); await service.UpdateSubscriptionProcess("", blProxy);
} }
public async Task RefreshServersBiz() private async Task RefreshServersBiz()
{ {
await RefreshServersMenu(); await RefreshServersMenu();

View file

@ -187,11 +187,7 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
break; break;
case EViewAction.DispatcherRefreshServersBiz: case EViewAction.DispatcherRefreshServersBiz:
Dispatcher.UIThread.Post(() => Dispatcher.UIThread.Post(RefreshServersBiz, DispatcherPriority.Default);
{
_ = RefreshServersBiz();
},
DispatcherPriority.Default);
break; break;
} }
@ -209,13 +205,8 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
await DialogHost.Show(dialog); await DialogHost.Show(dialog);
} }
public async Task RefreshServersBiz() public void RefreshServersBiz()
{ {
if (ViewModel != null)
{
await ViewModel.RefreshServersBiz();
}
if (lstProfiles.SelectedIndex >= 0) if (lstProfiles.SelectedIndex >= 0)
{ {
lstProfiles.ScrollIntoView(lstProfiles.SelectedItem, null); lstProfiles.ScrollIntoView(lstProfiles.SelectedItem, null);

View file

@ -63,12 +63,7 @@ public partial class StatusBarView : ReactiveUserControl<StatusBarViewModel>
ViewModel?.TestServerAvailabilityResult((string)obj), ViewModel?.TestServerAvailabilityResult((string)obj),
DispatcherPriority.Default); DispatcherPriority.Default);
break; break;
case EViewAction.DispatcherRefreshServersBiz:
Dispatcher.UIThread.Post(() =>
ViewModel?.RefreshServersBiz(),
DispatcherPriority.Default);
break;
case EViewAction.DispatcherRefreshIcon: case EViewAction.DispatcherRefreshIcon:
Dispatcher.UIThread.Post(() => Dispatcher.UIThread.Post(() =>

View file

@ -168,10 +168,7 @@ public partial class ProfilesView
break; break;
case EViewAction.DispatcherRefreshServersBiz: case EViewAction.DispatcherRefreshServersBiz:
Application.Current?.Dispatcher.Invoke((() => Application.Current?.Dispatcher.Invoke(RefreshServersBiz, DispatcherPriority.Normal);
{
_ = RefreshServersBiz();
}), DispatcherPriority.Normal);
break; break;
} }
@ -190,13 +187,8 @@ public partial class ProfilesView
await DialogHost.Show(dialog, "RootDialog"); await DialogHost.Show(dialog, "RootDialog");
} }
public async Task RefreshServersBiz() public void RefreshServersBiz()
{ {
if (ViewModel != null)
{
await ViewModel.RefreshServersBiz();
}
if (lstProfiles.SelectedIndex > 0) if (lstProfiles.SelectedIndex > 0)
{ {
lstProfiles.ScrollIntoView(lstProfiles.SelectedItem, null); lstProfiles.ScrollIntoView(lstProfiles.SelectedItem, null);

View file

@ -86,12 +86,7 @@ public partial class StatusBarView
}), DispatcherPriority.Normal); }), DispatcherPriority.Normal);
break; break;
case EViewAction.DispatcherRefreshServersBiz:
Application.Current?.Dispatcher.Invoke((() =>
{
ViewModel?.RefreshServersBiz();
}), DispatcherPriority.Normal);
break;
case EViewAction.DispatcherRefreshIcon: case EViewAction.DispatcherRefreshIcon:
Application.Current?.Dispatcher.Invoke((async () => Application.Current?.Dispatcher.Invoke((async () =>