В чем разница между [OperationContract (IsOneWay = true)] и проверкой сгенерированного флажка асинхронных операций? - PullRequest
7 голосов
/ 15 декабря 2009

В чем разница между маркировкой метода 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 Ответ

11 голосов
/ 15 декабря 2009

Это очень разные.

На концептуальном уровне IsOneWay = true говорит о том, что шаблон обмена сообщениями - «включи и забудь», а не, например, 'ответ на запрос'. То есть IOW = true означает, что имеется сообщение от клиента к серверу, но нет ответа от сервера клиенту. Напротив, метод не-IOW = true, как правило, будет иметь ответное сообщение, даже если тип возвращаемого значения void (например, «пустое» сообщение).

Асинхронный шаблон для поведения клиентского кода - например, блокирует ли он ожидание возвращаемого значения или нет. Async - это «локальная» вещь, подробности смотрите в этом блоге . Вы можете иметь асинхронный клиент для сервера синхронизации или клиент синхронизации для асинхронного сервера. WCF сделает волшебство под капотом, чтобы дать вам любую модель программирования. Если у вас есть, например, шаблон обмена запросом-ответом и использование «сгенерировать асинхронность», сгенерированный клиент предоставит вам, например, метод, который вы можете вызвать async (например, отправить сообщение и получить обратный вызов при получении ответа).

Так что используйте «async» для «модели локального программирования» и используйте IOW для «обмена сообщениями по проводам».

Обратите внимание, что в вашем примере, если вы пометите метод IOW = true, то я думаю, что в коде сервера нет причин для Thread.Start (). Вы можете просто выполнить работу прямо в потоке, который WCF дал вашему серверу.

...