Получение ответа от асинхронного вызова объекта Castle Wcf - PullRequest
1 голос
/ 12 января 2011

Скажи, что у меня есть такой звонок:

 _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);

Но жалуется ли на неоднозначный звонок?

Есть указатели?

1 Ответ

0 голосов
/ 12 января 2011

Крейг Нойвирт ответил на это: http://groups.google.com/group/castle-project-users/browse_thread/thread/f440dbd05e60484f

Я думаю, вы можете быть немного озадачены нормальным асинхронным шаблоном C #.Он всегда включает пару начальных / конечных вызовов.

WCF Facility поддерживает 2 модели обратного вызова, которые определяются последними 2 аргументами вашего BeginWcfCall

2 варианта: 1) Action>, состояние 2) AsyncCallback, состояние

Вариант 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 
                                                                    }); 

Как видите, для первого требуется ссылка на прокси _actService для вызова end.Первый - это удобный метод, которого нет.

 _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 #.

...