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);
}
}