2011-05-30 84 views
3

我想知道如何取消使用TakeUntil使用被動擴展調用的異步方法。如何取消使用Rx調用的異步方法

所以我希望能夠取消\停止以下方法:

this.booksService.Search(searchText) 
       .ObserveOnDispatcher() 
       .Subscribe(results => 
       { 
        this.books.Clear(); 
        this.books.AddRange(results); 
       }); 

回答

2

Subscribe()回報是一個IDisposable,在廢棄的價值,就像這樣:

var searchSub = this.booksService 
        .Search(searchText) ... 
        .Subscribe(...); 
// do something else 
searchSub.Dispose(); 

訂閱被停止。這實際上是否停止了潛在的BooksSevice搜索?這取決於實施。如果完成w/Observable.Create那麼很有可能得到這種行爲。

0

你將不得不告訴booksService取消搜索。 Search方法開始搜索,並返回IObservable。當搜索完成時OnNext將在IObservable上被調用。在Search中有一些異步代碼需要取消。

0

我的建議是將搜索方法更改爲將CancellationToken作爲第二個參數的異步調用。然後可以通過Observable.ToAsync將其轉換爲Observable序列。在這個observable上調用dispose會觸發取消CancellationToken。這樣做可以讓您輕鬆地將令牌傳遞到異步Web呼叫等。

public Task Search(string searchText, CancellationToken cancel) 
{ 
    // Pass the token on to the async webclient request etc. 
} 

var searchSub = Observable.ToAsync(c => this.booksService.Search(searchText, c)) 
       .Subscribe(...); 
// do something else 
searchSub.Dispose();