Пакет: reactiveui.maui, reactiveui.fody, shiny.jobs, shiny.hosting.maui < /p>
У меня есть работа на переднем плане, что Периодически работает как синглтон, он вводит синглтон IcloudtodeviceStateManager, который поддерживает некоторые общие свойства для других услуг. наблюдать. В этом случае, если работа работает или нет. Я ожидаю, что свойство ViewModel Isrunning будет обновлено при каждом изменении, чтобы я мог отобразить активность на странице, которая показывает, что задание работает. Но только когда-либо получал значение завершения задания .. < /p>
Код: Выделить всё
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>
Я вводил этот Statemanager в ViewModel < /p>
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);
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... t-received