从方法和其他方法创建IObservable(Create an IObservable from a method and others)
下面的代码是否正确编写以返回Rx库方面的IObservable? 它似乎工作正常,但想知道我正确使用它。
private IObservable<SearchResult[]> Search(string query) { return Observable.Create((IObserver<SearchResult[]> observer)=> { List<SearchResult> result = new List<SearchResult>(); foreach (TestsGroupMeta group in Engine.Groups) { string name = group.ToString(); if (name.IndexOf(query, StringComparison.InvariantCultureIgnoreCase) != -1) { result.Add(new SearchResult{ Name = name, Type = "Group"}); } foreach (TestMethodMeta method in group.Methods) { name = method.ToString(); if (name.IndexOf(query, StringComparison.InvariantCultureIgnoreCase) != -1) { result.Add(new SearchResult {Name = name, Type = "Method"}); } } } observer.OnNext(result.ToArray()); observer.OnCompleted(); return () => {}; }); }用法是这样的。
private void SearchForm_Load(object sender, EventArgs e) { var textChanged = Observable.FromEventPattern<EventArgs>(txtQuery, "TextChanged") .Select(_ => ((TextBox)_.Sender).Text); var searchResult = from query in textChanged where query.Length >= 3 from result in Search(query) select result; _resultsWatcher = searchResult .Throttle(TimeSpan.FromMilliseconds(200)) .ObserveOn(lvResults) .Subscribe(resuts => { lvResults.BeginUpdate(); lvResults.Items.Clear(); foreach (SearchResult result in resuts) { ListViewItem item = new ListViewItem(result.Name); item.SubItems.Add(result.Type); lvResults.Items.Add(item); } lvResults.EndUpdate(); }); }另外,有没有办法从这种方法创建一个IObservable?
Task<List<SearchResult>> Search(string query){...}或者,在大型数据集上创建异步搜索并从中获取IObservable的其他方法是什么。
谢谢
Is the code below correctly written to return an IObservable in terms of Rx library? It seems to work correct, but wondering I'm using it correctly.
private IObservable<SearchResult[]> Search(string query) { return Observable.Create((IObserver<SearchResult[]> observer)=> { List<SearchResult> result = new List<SearchResult>(); foreach (TestsGroupMeta group in Engine.Groups) { string name = group.ToString(); if (name.IndexOf(query, StringComparison.InvariantCultureIgnoreCase) != -1) { result.Add(new SearchResult{ Name = name, Type = "Group"}); } foreach (TestMethodMeta method in group.Methods) { name = method.ToString(); if (name.IndexOf(query, StringComparison.InvariantCultureIgnoreCase) != -1) { result.Add(new SearchResult {Name = name, Type = "Method"}); } } } observer.OnNext(result.ToArray()); observer.OnCompleted(); return () => {}; }); }The usage is like this.
private void SearchForm_Load(object sender, EventArgs e) { var textChanged = Observable.FromEventPattern<EventArgs>(txtQuery, "TextChanged") .Select(_ => ((TextBox)_.Sender).Text); var searchResult = from query in textChanged where query.Length >= 3 from result in Search(query) select result; _resultsWatcher = searchResult .Throttle(TimeSpan.FromMilliseconds(200)) .ObserveOn(lvResults) .Subscribe(resuts => { lvResults.BeginUpdate(); lvResults.Items.Clear(); foreach (SearchResult result in resuts) { ListViewItem item = new ListViewItem(result.Name); item.SubItems.Add(result.Type); lvResults.Items.Add(item); } lvResults.EndUpdate(); }); }Also, Is there a way to create an IObservable from such a method?
Task<List<SearchResult>> Search(string query){...}Or, what would be other approaches to create an asynchronous search over a large dataset and have an IObservable from it.
Thx
最满意答案
你可以从任务中创建一个observable,
Task<List<SearchResult>> SearchAsync(string query){...} var observable = Observable.FromAsync<List<SearchResult>>(()=> SearchAsync(query));如果您的函数将来只返回1个结果,请考虑使用Task吗?
public async Task<SearchResult[]> SearchAsync(string query){ }you can create an observable from task as such,
Task<List<SearchResult>> SearchAsync(string query){...} var observable = Observable.FromAsync<List<SearchResult>>(()=> SearchAsync(query));If your function is returning just 1 result in the future consider using Task instead?
public async Task<SearchResult[]> SearchAsync(string query){ }更多推荐
发布评论