可观察的订阅未达到完成
问题描述:
我想创建一个可观察的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");
});
但它永远不会伸手完成块。你能建议我要去哪里吗?
@Edited 26日
感谢斯托Vučetin,Rarous和李·坎贝尔。我已经测试了所有三个建议,都在工作。但我喜欢Petar的方法使单行代码成为可能。即使它看起来Observable.FromAsyncPatterns被depricated。
答
如果您可以为您的WCF客户端生成异步方法,则可以尝试此方法。
static void Main(string[] args)
{
var searcher = Search("test").Subscribe(Console.WriteLine);
Console.WriteLine("Done");
Console.ReadLine();
}
private static IObservable<string[]> Search(string searchTerm)
{
var searchClient = new Service1Client();
return Task<string[]>.Factory.FromAsync(searchClient.BeginGetData, searchClient.EndGetData, searchTerm, null).ToObservable();
}
答
从事件创建的观察对象从未运行完成。正如Petar提到的,您可以从Async模式创建Observables。相反铸造Task
可观察到的,你可以使用工厂方法:
IObservable<string[]> Search(string searchTerm)
{
var searchClient = new Service1Client();
return Observable.FromAsyncPatterns(searchClient.BeginGetData, searchClient.EndGetData)(searchTerm);
}
答
@Rarous是正确的。一个事件没有完成的概念,所以FromEventPattern永远不会完成(或错误)。我认为最喜欢的方法是使用PetarVučetin指定的Task.FromAsync.ToObservable,然后考虑Rarous指定的FromAsyncPattern。如果你真的想,你可以通过使它看起来像这样来纠正你的代码。
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);
o.OnCompleted();
}
else
{
o.OnError(r.EventArgs.Error);
}
});
searchClient.SearchAsync(searchTerm);
return subscription;
});
}
我认为最新的位使得FromAsyncPatterns过时了。 – 2013-04-30 00:22:32
我明白了,我仍然瞄准.net 4.0。 – 2013-04-30 03:59:32