我刚刚开始学习Observable
及其所有变化并遇到一些奇怪的问题。这是:
我有一个WCF服务声明(在“添加服务引用”过程之后):
public IAsyncResult ReceiveAllUsersAsync(AsyncCallback Callback, object State)
{
// Do some work
}
这里是最后一个:
public IObservable<User> EndReceiveAllUsers(IAsyncResult AsyncResultHandler)
{
// Do some work (actuall y it's a: return AsyncResultHandler.EndInvoke();
// return IObservable<User>
}
您可以看到EndReceiveAllUsers
User
返回集合
接下来我像这样运行RX:
// This will not owrk
Func<IObservable<User>> callWcfService = Observable.FromAsyncPattern<IObservable<User>>(BeginReceiveAll, EndReceiveAll);
// Actuall Func<> signature is:
Func<IObservable< IObservable<User> >> callWcfService = Observable.FromAsyncPattern<IObservable<User>>(BeginReceiveAll, EndReceiveAll);
但问题是,Observable.FromAsyncPattern
返回的任何内容都是IObservable<>
的{{1}}。实际上它会返回IObservable<User>
。我如何才能返回IObservable< IObservable<User> >
的一个结果,而不是结果集合
答案 0 :(得分:1)
这实际上取决于您想要的行为,但要直接回答您的问题,您可以在完成最后一个用户后简单地连接每个用户序列:
IObservable<IObservable<User>> tooMuch = callWcfService();
IObservable<User> justRight = tooMuch.Concat();
答案 1 :(得分:0)
编辑:
Observable
为您提取了对ReceiveAllUsersAsync
/ EndReceiveAllUsers
的多次调用,因此每次获得整个IEnumerable<User>
时,它都会Observable
整体生成}。因此,如果要逐个生成User
,则需要切换到一次生成一个用户的函数。 ReceiveAllUsersAsync
不是您需要的功能,因为它会等到获得所有用户,然后将它们全部放回一个包中。
您可以做的一件事是将获得的IEnumerable<User>
转换为IObservable<User>
,但这将再次以这样的方式运行:(1)让所有用户陷入困境,(2)不停顿地生成所有这些 - 这不是你对一个体面的IObservable<>
所期望的。
旧答案,供参考:
看http://msdn.microsoft.com/en-us/library/hh212031%28v=vs.103%29.aspx:
public static Func<IObservable<TResult>> FromAsyncPattern<TResult>(
Func<AsyncCallback, Object, IAsyncResult> begin,
Func<IAsyncResult, TResult> end
)
所以你可能只需要Observable.FromAsyncPattern<User>
,因为User
是TResult
。