У меня есть службы наследия WCF с рядом операционных контрактами One-Way, реализованных в наиболее классическом способе:Односторонний асинхронные/ждут звонков в WCF
// The interface
[OperationContract(IsOneWay = true, AsyncPattern = true)]
IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState);
void EndFinalizePublishing(IAsyncResult result);
// The service
public IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState)
{...}
Так что все отлично работает здесь, теперь мне нужно чтобы преобразовать это в C# 5 последний шаблон async/await. Обратите внимание на одностороннюю природу операций. Мои вопросы:
- Я думаю, мне нужно удалить
AsyncPattern = true
из атрибутаOperationContract
. - Замените тип возврата
IAsyncResult
с интерфейсомvoid
иasync void
в классе. - Удалите начало/конец и добавьте постсинтез Async для удобства.
Теперь, как я могу назвать одностороннюю операцию с клиентом? Нет использования async/await на стороне клиента для односторонних вызовов?
Это правильно и приведет к истинной асинхронной обработке на стороне клиента.
// The proxy
public void FinalizePublishingAsync(PageContent pageContent)
{
Channel.FinalizePublishingAsync(pageContent);
}
// The consumer of the client
// No way to use await for void methods.
IComPublisherFinalizerClient cl = new IComPublisherFinalizerClient();
cl.FinalizePublishingAsync(content);
cl.Close();
Stephen, Спасибо за ответ. Односторонние вызовы не имеют ответного сообщения и ожидаются до тех пор, пока сервер не получит запрос - именно поэтому они помечены как пустота. Но, как я знаю (Juval пишет об этом), сервер действительно отправляет короткий ответ msg, говорящий, что запрос клиента поставлен в очередь. IAsyncResult решает эту проблему. И вы хотите сказать, что хотя операция (отмеченная как OneWay) возвращает задание, вызывающий не будет заблокирован до ответа сервера? Или он будет действовать как обычная операция OneWay блокировки до ответа серверов? – Zara
Он будет действовать как обычная операция OneWay. Поэтому он не будет дожидаться завершения (или вызванного) метода сервера и не будет сообщать об ошибках с сервера. –