1
我從舊的例子代碼(無UI 4):無UI 6:我怎樣才能在版本達到4版相同的功能6
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);
});
它正常工作,用戶界面不會阻止和按鈕禁用,直到進度得到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());
}
它的工作原理,但按鈕不會禁用。
2)隨着CreateAsyncTask
GenerateCommand = ReactiveCommand.CreateAsyncTask(canGenerate, x => DoSomething());
public async Task<Unit> DoSomething()
{
var exe = Enumerable.Range(0, 10).Select(
x =>
{
Thread.Sleep(200);
return x;
}).ToObservable().ObserveOnDispatcher().SubscribeOn(NewThreadScheduler.Default);
await exe;
exe.Subscribe(x =>
Progress+=10
);
return new Unit();
}
它的工作原理,但只扣到禁用等待結束。
3)基於ReactiveUI 6 Async Command Not Running on Background Thread in WPF app
GenerateCommand = ReactiveCommand.CreateAsyncTask(canGenerate, x => DoSomething());
public async Task<Unit> DoSomething()
{
var execTask = Task.Factory.StartNew(() =>
{
var exe = Enumerable.Range(0, 10).Select(
x =>
{
Thread.Sleep(200);
return x;
}).ToObservable();
exe.Subscribe(x =>
Progress += 10
);
return new Unit();
});
return execTask.Result;
}
這拋出異常。
UPDATE
4)Subscribe
命令:
GenerateCommand = ReactiveCommand.CreateAsyncObservable(canGenerate, x => DoSomething());
GenerateCommand.ObserveOnDispatcher().SubscribeOn(NewThreadScheduler.Default)
.Subscribe(x => Progress += 10);
public IObservable<int> DoSomething()
{
return = Observable.Range(0, 10).Select(
x =>
{
Thread.Sleep(200);
return x;
});
}
同樣的結果...
我怎麼可能有6個版本實現相同的功能?
我在做什麼錯?
爲什麼你要做'Enumerable.Range(...)。ToObservable'而不是'Observable.Range(...)'?儘可能避免從'Enumerable'變爲'Observable'。 – Enigmativity 2014-10-18 04:40:32
你爲什麼還訂購一個可觀察的內部任務?好像你不懂如何正確使用Rx。 – Enigmativity 2014-10-18 04:41:32
謝謝你的建議,但問題是如何實現相同的功能...正如我所說我嘗試了幾個代碼...我更新了其他代碼,我也試過了...我希望你可以幫我一個例子! – UUHHIVS 2014-10-18 05:41:37