В чем разница между [OperationContract(IsOneWay = true)] и проверкой сгенерированного флажка асинхронных операций?
В чем разница между маркировкой метода WCF
[OperationContract(IsOneWay = true)]
атрибут и проверка флажка генерации асинхронных операций при добавлении ссылки на службу?
Из того, что я прочитал, кажется, что асинхронный характер вызова должен быть определен только на стороне клиента. Если это так, то какой смысл [OperationContract(IsOneWay = true)]
?
Прямо сейчас у меня просто следующий метод работает в методе WCF.
public void UpdateIndex(IndexElement[] indexElements)
{
// start the update on a new thread.
Thread thread = new Thread(() => UpdateIndexThread(indexElements));
thread.Start();
}
Я создал ссылку на сервис в коде моего клиента и просто звоню:
indexerClient.UpdateIndex(indexElements);
куда indexerClient
это экземпляр моей службы WCF.
Должно ли это также работать? Кажется, что нет, похоже, что он ожидает завершения потока, прежде чем вернуться.
1 ответ
Это очень разные.
На концептуальном уровне IsOneWay=true говорит о том, что шаблон обмена сообщениями "запускай и забывай", а не "запрос-ответ". То есть IOW=true означает, что имеется сообщение от клиента к серверу, но нет ответа от сервера клиенту. Напротив, метод не-IOW=true обычно будет иметь ответное сообщение, даже если тип возвращаемого значения void (например, "пустое" сообщение).
Асинхронный шаблон предназначен для поведения клиентского кода - например, блокирует ли он ожидание возвращаемого значения или нет. Async - это локальная вещь, подробности смотрите в этом блоге. У вас может быть асинхронный клиент для сервера синхронизации или клиент синхронизации для асинхронного сервера. WCF сделает волшебство под капотом, чтобы дать вам любую модель программирования. Если у вас есть, например, шаблон обмена сообщениями "запрос-ответ" и вы используете "генерировать асинхронный", сгенерированный клиент предоставит вам, например, метод, который вы можете вызвать асинхронным (например, отправить сообщение и получить обратный вызов при получении ответа).
Поэтому используйте "async" для "модели локального программирования" и используйте IOW для "обмена сообщениями по проводам".
Обратите внимание, что в вашем примере, если вы отметите метод IOW=true, я думаю, что в коде сервера нет причин для Thread.Start(). Вы можете просто выполнить работу прямо в потоке, который WCF дал вашему серверу.