Каково различие между [OperationContract (IsOneWay = верный)] и проверка сгенерированного асинхронного операционного флажка?

С чем различие между маркировкой метода 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.

Это должно также работать? Это не кажется, это почти, как будто это ожидает потока для завершения перед возвратом.

7
задан Laurel 29 March 2016 в 02:55
поделиться

1 ответ

Они очень разные.

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

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

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

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

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

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

11
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: