2011-05-30 48 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();