2013-04-30 8 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() перед вашей работой, если вы хотите завершить операцию службы до начала. Это позволило мне выйти из службы из сервисной операции без исключения.