2014-10-18 29 views
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個版本實現相同的功能?

我在做什麼錯?

+0

爲什麼你要做'Enumerable.Range(...)。ToObservable'而不是'Observable.Range(...)'?儘可能避免從'Enumerable'變爲'Observable'。 – Enigmativity 2014-10-18 04:40:32

+0

你爲什麼還訂購一個可觀察的內部任務?好像你不懂如何正確使用Rx。 – Enigmativity 2014-10-18 04:41:32

+1

謝謝你的建議,但問題是如何實現相同的功能...正如我所說我嘗試了幾個代碼...我更新了其他代碼,我也試過了...我希望你可以幫我一個例子! – UUHHIVS 2014-10-18 05:41:37

回答

5

這是一種非常奇怪的方式來做你想做的事情。如何改爲:

StartAsyncCommand = ReactiveCommand.CreateAsyncObservable(_ => 
    Observable.Timer(DateTimeOffset.Zero, TimeSpan.FromSeconds(1)) 
     .Take(10) 
     .Scan(0, (acc,x) => acc + 10)); 

StartAsyncCommand.ToProperty(this, x => x.Progress, out progress);