我从旧示例(Reactive UI 4)获得此代码:
StartAsyncCommand = new ReactiveCommand();
StartAsyncCommand.RegisterAsyncAction(_ =>
{
Progress = 0;
var exe = Enumerable.Range(0, 10).Select(x =>
{
Thread.Sleep(100);
return x;
}).ToObservable();
exe.Subscribe(x =>Progress += 10);
});
Run Code Online (Sandbox Code Playgroud)
它工作正常,UI不会阻止,按钮被禁用,直到进度达到100%.
当我迁移到版本6时,我尝试了许多方法来实现相同的功能而没有成功.
这些是我的尝试:
1)使用 CreateAsyncObservable
GenerateCommand = ReactiveCommand.CreateAsyncObservable(canGenerate, x => DoSomething());
public IObservable<Unit> DoSomething()
{
var exe = Enumerable.Range(0, 10).Select(
x =>
{
Thread.Sleep(200);
return x;
}).ToObservable().ObserveOnDispatcher().SubscribeOn(NewThreadScheduler.Default);
exe.Subscribe(x =>
Progress += 10
);
return Observable.Return(new Unit());
}
Run Code Online (Sandbox Code Playgroud)
它工作但按钮不会禁用.
2)有 CreateAsyncTask
GenerateCommand = ReactiveCommand.CreateAsyncTask(canGenerate, x => DoSomething());
public async Task<Unit> DoSomething()
{ …Run Code Online (Sandbox Code Playgroud)