ASP.NET MVC асинхронный вызов службы WCF - PullRequest
2 голосов
/ 18 марта 2010

После завершения асинхронного вызова службы WCF я хочу установить сообщение об успешном завершении сеанса и показать пользователю уведомление.

Я попытался использовать два способа для завершения этой операции.

1) Модель, основанная на событиях.

client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(GetDataCompleted);
client.GetDataAsync(id, client);
private void GetDataCompleted(object obj, GetDataCompletedEventArgs e) 
{
   this.SetNotification(new Notification() { Message = e.Result, Type =    NotificationType.Success });
}

В событии MyOperationCompleted я могу установить уведомление HttpContext.Current.Session, но я должен ждать, пока эта операция будет завершена, и не могу перейти на другие страницы.

2) Модель IAsyncResult. Таким образом, я могу переходить на другие страницы и выполнять асинхронные вызовы службы wcf, но в методе GetDataCallback не может установить уведомление, потому что session = null.

client.BeginGetData(id, GetDataCallback, client);
private void GetDataCallback(IAsyncResult ar)
{
    string name = ((ServiceReference1.Service1Client)ar.AsyncState).EndGetData(ar);
    this.SetNotification(new Notification() { Message = name, Type = NotificationType.Success });
}

«Создание асинхронных операций» в справочнике услуг включено.

Пожалуйста, помогите мне с этой проблемой. Спасибо.

1 Ответ

0 голосов
/ 14 июля 2010

Я не эксперт по wcf, но то, что я нашел для работы, это упаковка вашего вызова в Async-версию вашего метода в ThreadPool.QueueUserWorkItem. Без этого у меня была такая же проблема блокировки. Так что это, кажется, освобождает основной поток в вашем asv mvc для продолжения, пока другой рабочий поток ожидает обратного вызова.

Кроме того, я использовал AsyncController, хотя одного этого было недостаточно без рабочего потока.

Смотрите это: http://msdn.microsoft.com/en-us/library/ee728598.aspx

Я использовал это как руководство, но все еще нуждался в ThreadPool.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...