C# 集合的可观测返回集合

C# 集合的可观测返回集合,c#,system.reactive,C#,System.reactive,我刚刚开始学习可观察的和它的所有变体,遇到了一些奇怪的问题。这是: 我有一个WCF服务声明(在“添加服务引用”过程之后): 这里是结束语: public IObservable<User> EndReceiveAllUsers(IAsyncResult AsyncResultHandler) { // Do some work (actuall y it's a: return AsyncResultHandler.EndInvoke(); // return IObs

我刚刚开始学习可观察的和它的所有变体,遇到了一些奇怪的问题。这是:

我有一个WCF服务声明(在“添加服务引用”过程之后):

这里是结束语:

public IObservable<User> EndReceiveAllUsers(IAsyncResult AsyncResultHandler)
{
   // Do some work (actuall y it's a:  return AsyncResultHandler.EndInvoke();
   // return IObservable<User>
}
但问题是,从
可观察.FromAsyncPattern
返回的任何内容都是
IObservable
IObservable
。实际上,它返回
IObservable
。如何仅返回一个可观察的结果,而不返回结果的集合

编辑:

Observable
为您抽象了对
ReceiveAllUsersAsync
/
EndReceiveAllUsers
的多个调用,因此每次您得到一个完整的
IEnumerable
,它都是由
Observable
作为一个整体生成的。因此,如果您想一个接一个地生成
用户
s,您需要切换到一次生成一个用户的函数
ReceiveAllUsersAsync
不是您需要的功能,因为它会等待所有用户都被获取,然后将所有用户打包返回

您可以做的一件事是将获得的
IEnumerable
转换为
IObservable
,但这将再次表现为:(1)将所有用户置于幕后,(2)毫不停顿地生成所有用户——这不是您期望的体面的
IObservable


旧答案,供参考:
看看:

publicstaticfunc fromsynchpattern(
Func begin,
Func端
)
因此,您可能只需要
可观察。从AsyncPattern
,因为
用户
是您的
结果

编辑:

Observable
为您抽象了对
ReceiveAllUsersAsync
/
EndReceiveAllUsers
的多个调用,因此每次您得到一个完整的
IEnumerable
,它都是由
Observable
作为一个整体生成的。因此,如果您想一个接一个地生成
用户
s,您需要切换到一次生成一个用户的函数
ReceiveAllUsersAsync
不是您需要的功能,因为它会等待所有用户都被获取,然后将所有用户打包返回

您可以做的一件事是将获得的
IEnumerable
转换为
IObservable
,但这将再次表现为:(1)将所有用户置于幕后,(2)毫不停顿地生成所有用户——这不是您期望的体面的
IObservable


旧答案,供参考:
看看:

publicstaticfunc fromsynchpattern(
Func begin,
Func端
)

因此,您可能只需要观察
。从AsyncPattern
,因为
用户
是您的
TResult
,这实际上取决于您想要的行为,但要直接回答您的问题,您只需在完成最后一个用户序列后连接每个用户序列:

IObservable<IObservable<User>> tooMuch = callWcfService();
IObservable<User> justRight = tooMuch.Concat();
IObservable toomole=callWcfService();
IObservable justRight=toomole.Concat();

这实际上取决于您想要的行为,但要直接回答您的问题,您只需在完成最后一个用户序列后将每个用户序列连接起来:

IObservable<IObservable<User>> tooMuch = callWcfService();
IObservable<User> justRight = tooMuch.Concat();
IObservable toomole=callWcfService();
IObservable justRight=toomole.Concat();

这通常是正确的答案-但关键是我的
EndXXX
函数已经返回了
IObservable
-我应该把它传递回
Func
。您的建议显然会导致强制转换错误:无法将
System.IObservable
隐式转换为
User
。我猜当EndXXX返回集合,然后fromsync尝试将其包装到
TResult
-在我的情况下,它是单个
用户
-而它不能done@Jasper:看,你想让
用户
一个接一个出现,对吗?这意味着
EndXXX
函数应该提供单个
用户,而不是整个用户:当操作已经结束时,拥有
IObservable
没有多大意义——对吗?@Vlad no:)我运行服务->接收答案(在这种情况下,特别是将其包装为
IObservable
集合)。当(整个收集)收到后,我将对其进行分类并将其传递到管道中。我选择了
IObservable
,因为管道中的大多数函数都希望
IObservable
能够工作…@Jasper:哦,我明白了。然后您可以按照旧答案中的建议进行操作:使用
Observable.FromAsyncPattern
.Eee。。。。我的第一条评论是,我无法将返回的答案
IObservable
转换为
用户
——无法转换!这通常是正确的答案-但关键是我的
EndXXX
函数已经返回了
IObservable
-我应该把它传递回
Func
。您的建议显然会导致强制转换错误:无法将
System.IObservable
隐式转换为
User
。我猜当EndXXX返回集合,然后fromsync尝试将其包装到
TResult
-在我的情况下,它是单个
用户
-而它不能done@Jasper:看,你想让
用户
一个接一个出现,对吗?这意味着
EndXXX
函数应该提供单个
用户,而不是整个用户:当操作已经结束时,拥有
IObservable
没有多大意义——对吗?@Vlad no:)我运行服务->接收答案(在这种情况下,特别是将其包装为
IObservable
集合)。当(整个收集)收到后,我将对其进行分类并将其传递到管道中。我选择了
IObservable
,因为管道中的大多数函数都希望
IObservable
能够工作…@Jasper:哦,我明白了。然后您可以按照旧答案中的建议进行操作:使用
Observable.FromAsyncPattern
.Eee。。。。我的第一个评论是,我无法转换返回的答案
IObservablepublic static Func<IObservable<TResult>> FromAsyncPattern<TResult>(
    Func<AsyncCallback, Object, IAsyncResult> begin,
    Func<IAsyncResult, TResult> end
)
IObservable<IObservable<User>> tooMuch = callWcfService();
IObservable<User> justRight = tooMuch.Concat();