我刚刚开始学习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>
}
如您所见,User
的EndReceiveAllUsers
返回集合
接下来我像这样运行一个 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<User>
IObservable<>
。实际上它返回IObservable< IObservable<User> >
.我怎么能只返回一个IObservable<User>
结果而不是结果集合
这实际上取决于你想要的行为,但要直接回答你的问题,你可以在最后一个用户序列完成后简单地连接每个用户序列:
IObservable<IObservable<User>> tooMuch = callWcfService();
IObservable<User> justRight = tooMuch.Concat();
编辑:
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
。