.NET MAUI reactiveUi: JobStatemanager mit beobachtbarer <bool> Updates, die nicht von ViewModel empfangen werden, rechtz
Posted: 24 Feb 2025, 06:08
Projekt: .NET 9 MAUI
Paket: reactiveUi.maui, reactiveUi.fody, Shiny.jobs, Shiny.hosting.maui < /p>
Ich habe einen Vordergrundjob, das Als Singleton läuft regelmäßig ein Singleton von iCloudtodevicestatemanager, der einige gemeinsame Immobilien für andere Dienste zur Beobachtung unterhält. In diesem Fall, wenn der Job ausgeführt wird oder nicht. Ich gehe davon aus, dass die ViewModel Isrunning -Immobilie auf jeder Änderung aktualisiert wird, damit ich auf der Seite einen Aktivitätsindikator anzeigen kann, auf dem der Job ausgeführt wird. Aber immer nur den Wert des Jobabschlusses erhalten.
Wenn der Job ausgeführt wird, aktualisiert der _Statemanager.setIsRunning (true) das Statemanager, das Ansichtsmodell erhält diesen Wert nicht. Es empfängt immer nur den falschen Setter. Ich bin mir nicht sicher, was das Ansichtsmodell daran hindert, die wahre Aussage zu empfangen.
Paket: reactiveUi.maui, reactiveUi.fody, Shiny.jobs, Shiny.hosting.maui < /p>
Ich habe einen Vordergrundjob, das Als Singleton läuft regelmäßig ein Singleton von iCloudtodevicestatemanager, der einige gemeinsame Immobilien für andere Dienste zur Beobachtung unterhält. In diesem Fall, wenn der Job ausgeführt wird oder nicht. Ich gehe davon aus, dass die ViewModel Isrunning -Immobilie auf jeder Änderung aktualisiert wird, damit ich auf der Seite einen Aktivitätsindikator anzeigen kann, auf dem der Job ausgeführt wird. Aber immer nur den Wert des Jobabschlusses erhalten.
Code: Select all
public class CloudToDeviceStateManager : ReactiveObject
{
private readonly BehaviorSubject _isRunningSubject = new BehaviorSubject(false);
public IObservable IsRunningTicks => _isRunningSubject.AsObservable();
public bool IsRunning
{
get => _isRunningSubject.Value;
private set
{
_isRunningSubject.OnNext(value);
this.RaisePropertyChanged();
}
}
public void SetIsRunning(bool isRunning)
{
IsRunning = isRunning;
}
}
public partial class CloudToDeviceSyncJob : IJob
{
private readonly ICloudToDeviceStateManager _stateManager;
[ObservableAsProperty] public bool IsRunning { get; }
public CloudToDeviceSyncJob(ICloudToDeviceStateManager stateManager)
{
_stateManager = stateManager;
}
protected override async Task Run(CancellationToken cancelToken)
{
try
{
_stateManager.SetIsRunning(true);
cancelToken.ThrowIfCancellationRequested();
//... some logic here
}catch(Exception ex) {}
finally
{
_stateManager.SetIsRunning(false);
_logger.LogInformation("CloudToDeviceSyncJob finished");
}
}
}
< /code>
Ich habe diesen Statemanager in einen ViewModel < /p>
injiziert.
public class MainPageViewModel : ViewModelBase
{
private readonly ICloudToDeviceStateManager _stateManager;
[Reactive] public bool IsRunning { get; set; }
public MainPageViewModel(ICloudToDeviceStateManager stateManager)
{
_stateManager = stateManager;
// tried this..
this.WhenAnyValue(x => x._stateManager.IsRunning)
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(this, x => x.IsRunning);
// tried this
_stateManager.IsRunningTicks.Subscribe(x => IsRunning = x);
}
}