Skip to content

Commit ea1d438

Browse files
committed
Use Rx event subscription to replace MessageBus refresh configuration file function
1 parent a108eaf commit ea1d438

9 files changed

Lines changed: 59 additions & 75 deletions

File tree

v2rayN/ServiceLib/Enums/EMsgCommand.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@ public enum EMsgCommand
55
ClearMsg,
66
SendMsgView,
77
SendSnackMsg,
8-
RefreshProfiles,
98
AppExit
109
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Reactive;
2+
using System.Reactive.Subjects;
3+
4+
namespace ServiceLib.Handler;
5+
6+
public static class AppEvents
7+
{
8+
public static readonly Subject<Unit> ProfilesRefreshRequested = new();
9+
}

v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ private async Task UpdateTaskHandler(bool success, string msg)
260260
if (success)
261261
{
262262
var indexIdOld = _config.IndexId;
263-
RefreshServers();
263+
await RefreshServers();
264264
if (indexIdOld != _config.IndexId)
265265
{
266266
await Reload();
@@ -350,9 +350,11 @@ public void Shutdown(bool byUser)
350350

351351
#region Servers && Groups
352352

353-
private void RefreshServers()
353+
private async Task RefreshServers()
354354
{
355-
MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString());
355+
AppEvents.ProfilesRefreshRequested.OnNext(Unit.Default);
356+
357+
await Task.Delay(200);
356358
}
357359

358360
private void RefreshSubscriptions()
@@ -384,7 +386,7 @@ public async Task AddServerAsync(bool blNew, EConfigType eConfigType)
384386
}
385387
if (ret == true)
386388
{
387-
RefreshServers();
389+
await RefreshServers();
388390
if (item.IndexId == _config.IndexId)
389391
{
390392
await Reload();
@@ -399,11 +401,11 @@ public async Task AddServerViaClipboardAsync(string? clipboardData)
399401
await _updateView?.Invoke(EViewAction.AddServerViaClipboard, null);
400402
return;
401403
}
402-
int ret = await ConfigHandler.AddBatchServers(_config, clipboardData, _config.SubIndexId, false);
404+
var ret = await ConfigHandler.AddBatchServers(_config, clipboardData, _config.SubIndexId, false);
403405
if (ret > 0)
404406
{
405407
RefreshSubscriptions();
406-
RefreshServers();
408+
await RefreshServers();
407409
NoticeManager.Instance.Enqueue(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret));
408410
}
409411
else
@@ -449,11 +451,11 @@ private async Task AddScanResultAsync(string? result)
449451
}
450452
else
451453
{
452-
int ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false);
454+
var ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false);
453455
if (ret > 0)
454456
{
455457
RefreshSubscriptions();
456-
RefreshServers();
458+
await RefreshServers();
457459
NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedServerViaScan);
458460
}
459461
else
@@ -532,7 +534,7 @@ public async Task RebootAsAdmin()
532534
private async Task ClearServerStatistics()
533535
{
534536
await StatisticsManager.Instance.ClearAllServerStatistics();
535-
RefreshServers();
537+
await RefreshServers();
536538
}
537539

538540
private async Task OpenTheFileLocation()

v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public ProfilesViewModel(Func<EViewAction, object?, Task<bool>>? updateView)
126126
this.WhenAnyValue(
127127
x => x.ServerFilter,
128128
y => y != null && _serverFilter != y)
129-
.Subscribe(c => ServerFilterChanged(c));
129+
.Subscribe(async c => await ServerFilterChanged(c));
130130

131131
//servers delete
132132
EditServerCmd = ReactiveCommand.CreateFromTask(async () =>
@@ -249,7 +249,10 @@ public ProfilesViewModel(Func<EViewAction, object?, Task<bool>>? updateView)
249249

250250
if (_updateView != null)
251251
{
252-
MessageBus.Current.Listen<string>(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext);
252+
AppEvents.ProfilesRefreshRequested
253+
.AsObservable()
254+
.ObserveOn(RxApp.MainThreadScheduler)
255+
.Subscribe(async _ => await RefreshServersBiz());//.DisposeWith(_disposables);
253256
}
254257

255258
_ = Init();
@@ -263,18 +266,13 @@ private async Task Init()
263266
SelectedServer = new();
264267

265268
await RefreshSubscriptions();
266-
RefreshServers();
269+
await RefreshServers();
267270
}
268271

269272
#endregion Init
270273

271274
#region Actions
272275

273-
private async void OnNext(string x)
274-
{
275-
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
276-
}
277-
278276
private void Reload()
279277
{
280278
Locator.Current.GetService<MainWindowViewModel>()?.Reload();
@@ -353,12 +351,12 @@ private async Task SubSelectedChangedAsync(bool c)
353351
}
354352
_config.SubIndexId = SelectedSub?.Id;
355353

356-
RefreshServers();
354+
await RefreshServers();
357355

358356
await _updateView?.Invoke(EViewAction.ProfilesFocus, null);
359357
}
360358

361-
private void ServerFilterChanged(bool c)
359+
private async Task ServerFilterChanged(bool c)
362360
{
363361
if (!c)
364362
{
@@ -367,16 +365,18 @@ private void ServerFilterChanged(bool c)
367365
_serverFilter = ServerFilter;
368366
if (_serverFilter.IsNullOrEmpty())
369367
{
370-
RefreshServers();
368+
await RefreshServers();
371369
}
372370
}
373371

374-
public void RefreshServers()
372+
public async Task RefreshServers()
375373
{
376-
MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString());
374+
AppEvents.ProfilesRefreshRequested.OnNext(Unit.Default);
375+
376+
await Task.Delay(200);
377377
}
378378

379-
public async Task RefreshServersBiz()
379+
private async Task RefreshServersBiz()
380380
{
381381
var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter);
382382
_lstProfile = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(lstModel)) ?? [];
@@ -395,6 +395,8 @@ public async Task RefreshServersBiz()
395395
SelectedProfile = lstModel.First();
396396
}
397397
}
398+
399+
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
398400
}
399401

400402
public async Task RefreshSubscriptions()
@@ -514,7 +516,7 @@ public async Task EditServerAsync(EConfigType eConfigType)
514516
}
515517
if (ret == true)
516518
{
517-
RefreshServers();
519+
await RefreshServers();
518520
if (item.IndexId == _config.IndexId)
519521
{
520522
Reload();
@@ -541,7 +543,7 @@ public async Task RemoveServerAsync()
541543
{
542544
_profileItems.Clear();
543545
}
544-
RefreshServers();
546+
await RefreshServers();
545547
if (exists)
546548
{
547549
Reload();
@@ -553,7 +555,7 @@ private async Task RemoveDuplicateServer()
553555
var tuple = await ConfigHandler.DedupServerList(_config, _config.SubIndexId);
554556
if (tuple.Item1 > 0 || tuple.Item2 > 0)
555557
{
556-
RefreshServers();
558+
await RefreshServers();
557559
Reload();
558560
}
559561
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveDuplicateServerResult, tuple.Item1, tuple.Item2));
@@ -568,7 +570,7 @@ private async Task CopyServer()
568570
}
569571
if (await ConfigHandler.CopyServer(_config, lstSelected) == 0)
570572
{
571-
RefreshServers();
573+
await RefreshServers();
572574
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
573575
}
574576
}
@@ -601,7 +603,7 @@ public async Task SetDefaultServer(string? indexId)
601603

602604
if (await ConfigHandler.SetDefaultServerIndex(_config, indexId) == 0)
603605
{
604-
RefreshServers();
606+
await RefreshServers();
605607
Reload();
606608
}
607609
}
@@ -652,7 +654,7 @@ private async Task SetDefaultMultipleServer(ECoreType coreType, EMultipleLoad mu
652654
}
653655
if (ret?.Data?.ToString() == _config.IndexId)
654656
{
655-
RefreshServers();
657+
await RefreshServers();
656658
Reload();
657659
}
658660
else
@@ -675,13 +677,13 @@ public async Task SortServer(string colName)
675677
return;
676678
}
677679
_dicHeaderSort[colName] = !asc;
678-
RefreshServers();
680+
await RefreshServers();
679681
}
680682

681683
public async Task RemoveInvalidServerResult()
682684
{
683685
var count = await ConfigHandler.RemoveInvalidServerResult(_config, _config.SubIndexId);
684-
RefreshServers();
686+
await RefreshServers();
685687
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count));
686688
}
687689

@@ -702,7 +704,7 @@ private async Task MoveToGroup(bool c)
702704
await ConfigHandler.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id);
703705
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
704706

705-
RefreshServers();
707+
await RefreshServers();
706708
SelectedMoveToGroup = null;
707709
SelectedMoveToGroup = new();
708710
}
@@ -723,7 +725,7 @@ public async Task MoveServer(EMove eMove)
723725
}
724726
if (await ConfigHandler.MoveServer(_config, _lstProfile, index, eMove) == 0)
725727
{
726-
RefreshServers();
728+
await RefreshServers();
727729
}
728730
}
729731

@@ -734,7 +736,7 @@ public async Task MoveServerTo(int startIndex, ProfileItemModel targetItem)
734736
{
735737
if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0)
736738
{
737-
RefreshServers();
739+
await RefreshServers();
738740
}
739741
}
740742
}

v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Reactive;
2+
using System.Reactive.Linq;
23
using System.Text;
34
using DynamicData.Binding;
45
using ReactiveUI;
@@ -216,15 +217,13 @@ public void InitUpdateView(Func<EViewAction, object?, Task<bool>>? updateView)
216217
_updateView = updateView;
217218
if (_updateView != null)
218219
{
219-
MessageBus.Current.Listen<string>(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext);
220+
AppEvents.ProfilesRefreshRequested
221+
.AsObservable()
222+
.ObserveOn(RxApp.MainThreadScheduler)
223+
.Subscribe(async _ => await RefreshServersBiz()); //.DisposeWith(_disposables);
220224
}
221225
}
222226

223-
private async void OnNext(string x)
224-
{
225-
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
226-
}
227-
228227
private async Task CopyProxyCmdToClipboard()
229228
{
230229
var cmd = Utils.IsWindows() ? "set" : "export";
@@ -263,7 +262,7 @@ private async Task UpdateSubscriptionProcess(bool blProxy)
263262
await service.UpdateSubscriptionProcess("", blProxy);
264263
}
265264

266-
public async Task RefreshServersBiz()
265+
private async Task RefreshServersBiz()
267266
{
268267
await RefreshServersMenu();
269268

v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,7 @@ private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
187187
break;
188188

189189
case EViewAction.DispatcherRefreshServersBiz:
190-
Dispatcher.UIThread.Post(() =>
191-
{
192-
_ = RefreshServersBiz();
193-
},
194-
DispatcherPriority.Default);
190+
Dispatcher.UIThread.Post(RefreshServersBiz, DispatcherPriority.Default);
195191
break;
196192
}
197193

@@ -209,13 +205,8 @@ public async Task ShareServer(string url)
209205
await DialogHost.Show(dialog);
210206
}
211207

212-
public async Task RefreshServersBiz()
208+
public void RefreshServersBiz()
213209
{
214-
if (ViewModel != null)
215-
{
216-
await ViewModel.RefreshServersBiz();
217-
}
218-
219210
if (lstProfiles.SelectedIndex >= 0)
220211
{
221212
lstProfiles.ScrollIntoView(lstProfiles.SelectedItem, null);

v2rayN/v2rayN.Desktop/Views/StatusBarView.axaml.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,7 @@ private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
6363
ViewModel?.TestServerAvailabilityResult((string)obj),
6464
DispatcherPriority.Default);
6565
break;
66-
67-
case EViewAction.DispatcherRefreshServersBiz:
68-
Dispatcher.UIThread.Post(() =>
69-
ViewModel?.RefreshServersBiz(),
70-
DispatcherPriority.Default);
71-
break;
66+
7267

7368
case EViewAction.DispatcherRefreshIcon:
7469
Dispatcher.UIThread.Post(() =>

v2rayN/v2rayN/Views/ProfilesView.xaml.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,7 @@ private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
168168
break;
169169

170170
case EViewAction.DispatcherRefreshServersBiz:
171-
Application.Current?.Dispatcher.Invoke((() =>
172-
{
173-
_ = RefreshServersBiz();
174-
}), DispatcherPriority.Normal);
171+
Application.Current?.Dispatcher.Invoke(RefreshServersBiz, DispatcherPriority.Normal);
175172
break;
176173
}
177174

@@ -190,13 +187,8 @@ public async void ShareServer(string url)
190187
await DialogHost.Show(dialog, "RootDialog");
191188
}
192189

193-
public async Task RefreshServersBiz()
190+
public void RefreshServersBiz()
194191
{
195-
if (ViewModel != null)
196-
{
197-
await ViewModel.RefreshServersBiz();
198-
}
199-
200192
if (lstProfiles.SelectedIndex > 0)
201193
{
202194
lstProfiles.ScrollIntoView(lstProfiles.SelectedItem, null);

v2rayN/v2rayN/Views/StatusBarView.xaml.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,7 @@ private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
8686
}), DispatcherPriority.Normal);
8787
break;
8888

89-
case EViewAction.DispatcherRefreshServersBiz:
90-
Application.Current?.Dispatcher.Invoke((() =>
91-
{
92-
ViewModel?.RefreshServersBiz();
93-
}), DispatcherPriority.Normal);
94-
break;
89+
9590

9691
case EViewAction.DispatcherRefreshIcon:
9792
Application.Current?.Dispatcher.Invoke((async () =>

0 commit comments

Comments
 (0)