1

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

4

2 回答 2

1

这实际上取决于您想要的行为,但要直接回答您的问题,您可以在完成最后一个用户后简单地连接每个用户序列:

IObservable<IObservable<User>> tooMuch = callWcfService();
IObservable<User> justRight = tooMuch.Concat();
于 2012-07-16T18:36:12.337 回答
0

编辑:

ObservableReceiveAllUsersAsync为您抽象了对/的多个调用EndReceiveAllUsers,因此每次获得一个整体IEnumerable<User>时,它都是由Observable. 因此,如果要User一个一个生成 s,则需要切换到一次生成一个用户的函数。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.

于 2012-07-16T13:47:50.017 回答