我正在尝试为 wcf 调用创建一个可观察的包装器,我创建如下。
方法是这样的,
private IObservable<List<string>> Search(string searchTerm)
{
return Observable.Create<List<string>>(o =>
{
var searchClient = new SearchServiceClient();
var s = Observable
.FromEventPattern<SearchCompletedEventArgs>(searchClient, "SearchCompleted");
var subscription = s.Subscribe(
r =>
{
if (r.EventArgs.Error == null)
o.OnNext(r.EventArgs.Result);
else
{
o.OnError(r.EventArgs.Error);
}
},
e =>
{
o.OnError(e);
},
() =>
{
o.OnCompleted();
});
searchClient.SearchAsync(searchTerm);
return subscription;
});
}
和方法调用是,
Search("reactive").Subscribe(
r =>
{
MessageBox.Show("Result");
},
e =>
{
MessageBox.Show(e.ToString());
},
() =>
{
MessageBox.Show("Completed");
});
但它永远不会到达已完成的块。你能建议我哪里出错了吗?
@26日编辑
感谢 Petar Vučetin、Rarous 和 Lee Campbell。我已经测试了所有三个建议,并且都在工作。但我喜欢 Petar 对单行代码的处理方式。即使它似乎 Observable.FromAsyncPatterns 已被贬低。