集合的可观察返回集合



我刚刚开始学习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>
}

如您所见,UserEndReceiveAllUsers返回集合

接下来我像这样运行一个 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

相关内容

  • 没有找到相关文章

最新更新