1

次のような電話があるとします。

 _actService.BeginWcfCall(x => x.SaveAct(new SaveActRequest
                                                             {
                                                                 Act = act
                                                             }));

SaveAct の応答を取得するにはどうすればよいですか? 操作が完了したときにコールバックを起動するように設定するにはどうすればよいですか?

私が試してみました:

    _actService.BeginWcfCall(x => x.GetAct(new GetActRequest
                                                            {
                                                                ActName =
                                                                    saveScheduleSlotRequest.ScheduleSlot.ActProxy.Name
                                                            }), (result) =>
                                                                    {
                                                                        var async = (GetActResponse)result.AsyncState;

                                                                    }, _actService);

しかし、それはあいまいな呼び出しについて文句を言いますか?

ポインタはありますか?

4

1 に答える 1

0

Craig Neuwirt はこれに答えました: http://groups.google.com/group/castle-project-users/browse_thread/thread/f440dbd05e60484f

通常の C# 非同期パターンについて少し混乱していると思います。これには常に、Begin/End 呼び出しのペアが含まれます。

WCF 機能は、BeginWcfCall の最後の 2 つの引数によって決定される 2 つのコールバック モデルをサポートします。

2 つのオプションは 1) Action>, state 2) AsyncCallback, state

オプション 1 は標準の非同期パターンで、次のようになります。

     _actService.BeginWcfCall(x => x.GetAct(new GetActRequest 
                                                            { 
                                                                ActName = 
                                                                    saveScheduleSlotRequest.ScheduleSlot.ActProxy.Name 
                                                            }), (IAsyncResult result) => 
                                                                    { 
                                                                        var response =  _actService.EndWcfCall<GetActResponse>(result); 
                                                                        // Do something with the response 
                                                                    }); 

ご覧のとおり、最初の例では end を呼び出すために _actService プロキシへの参照が必要です。1つ目は、そうでない便利な方法です。

 _actService.BeginWcfCall(x => x.GetAct(new GetActRequest 
                                                            { 
                                                                ActName = 
                                                                    saveScheduleSlotRequest.ScheduleSlot.ActProxy.Name 
                                                            }), (IWcfAsyncCall<GetActResponse> result) => 
                                                                    { 
                                                                        var response =  result.End(); 
                                                                        // Do something with the response 
                                                                    }); 

どちらのアプローチを選択するかは、c#standard 非同期パターンの好みに完全に依存します。

于 2011-01-12T14:13:10.950 に答える