可观察的收集回归集合

时间:2012-07-16 13:41:04

标签: c# system.reactive

我刚刚开始学习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> >的一个结果,而不是结果集合

2 个答案:

答案 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>,因为UserTResult