2013-04-30 12 views
1

Я использую WCF для асинхронного обмена данными между двумя процессами.
до сих пор я реализовал шаблон IAsyncResult, и сделал это с 3 способами:
BeginOperation - client.BeginOperation, когда служба получит его в очередь на работу ThreadPool с делегатом для работы
Эксплуатация - запуск на стороне службы
EndOperation - это то, что клиент обратный вызов.WCF Async вызывает это return void и является OneWay

Мой вопрос в том, что я хочу отправить строки от клиента к службе, я хочу, чтобы send был асинхронным, И я не хочу получать ответ - просто хочу, чтобы служба печатала строку.
Этого достаточно? Это должно быть Неблокирующий

[OperationContract(IsOneWay = true)] 
    void PrintString(string message); 

ИЛИ мне нужно сделать следующие:

[OperationContract(IsOneWay = true, AsyncPattern=true)] 
    void BeginPrintString(string message, AsyncCallback callback, object state); 
    void EndPrintString(IAsyncResult asyncResult); 

ответ

3

IsOneWay должно быть достаточно, но он все еще может блок ваш клиент в конкретных обстоятельствах, а также как ошибки .

this Смотреть и this сообщения для более подробной информации:

Общие вещи, которые вы должны иметь в виду, о OneWay операций -

O/W операции должны возвращать ничтожным. Операции O/W могут все же давать исключения . вызов операции на клиентском канале может все же вызвать исключение, если он не смог передать вызов на услугу . Операции O/W все еще могут блокироваться. если служба накачивается сообщениями , и очередь была запущена, вызов операции O/W может заблокировать ваш следующий код.

+0

Как IsOneWay достаточно, если они явно пишут, что: операции O/W все еще могут блокироваться. если служба накачивается сообщениями и запускается очередь, вызов операции O/W может блокировать ваш следующий код. – ilansch

+0

Его значение зависит от вашего использования/потребностей. Например, если вы вызываете сервер один раз в час, и вы сидите дросселирование до 100 одновременных вызовов, ... я бы рассмотрел возможность настройки конфигурации и использования (да, все еще может случиться), чтобы измерить возможность заблокированного/ожидающего клиента. – evgenyl

+0

это моя служба регистрации, что означает, что 5-10 различных процессов будут выполнять их регистрацию с использованием клиентских вызовов.каждый процесс имеет wcf-клиент, который отправляет строковое сообщение в журнал. служба затем запустит строку. постоянный вход в систему от нескольких клиентов, а Служба - одна – ilansch

-1

Вы можете сделать его более асинхронным, используя отдельный поток для выполнения своей работы.

Вместо:

public void MyOneWayServiceOperation() { 
    // do stuff 
} 

сделать что-то вроде:

public void MyOneWayServiceOperation() { 
    new Thread(() => { 
     // do stuff 
    }).Start(); 
} 

Операция услуги была выполнена на новом потоке в любом случае, так что это не должно вызывать никаких больше проблем для вашего кода быть в другом новом потоке.

Вы можете добавить вызов Thread.Sleep() перед вашей работой, если вы хотите завершить операцию службы до начала. Это позволило мне выйти из службы из сервисной операции без исключения.

 Смежные вопросы

  • Нет связанных вопросов^_^