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です。実際に戻ります。結果のコレクションではなく、結果を1つだけ返す方法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ます。したがって、Usersを1つずつ作成する場合は、ユーザーを1つずつ作成する関数に切り替える必要があります。ReceiveAllUsersAsyncすべてのユーザーが取得されるまで待機し、すべてのユーザーをパックに戻すため、は必要な機能ではありません。

あなたができることの1つは、取得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

于 2012-07-16T13:47:50.017 に答える