Безопасен ли поток WCF ClientBase? - PullRequest
30 голосов
/ 07 января 2011

Я реализовал ClientBase, чтобы использовать WCF для подключения к службе.Затем я вызываю метод на канале для связи со службой.

base.Channel.CalculateSomething();

Безопасен ли этот поток вызовов или я должен заблокировать его при запуске нескольких потоков?

Спасибо

Ответы [ 4 ]

15 голосов
/ 12 марта 2014

В последующих комментариях к ответам я тоже был неуверен, так что я немного покопался.Вот некоторые убедительные доказательства того, что ClientBase<T> является поточно-ориентированным - В этом сообщении в блоге обсуждается, как заставить службу WCF работать правильно при наличии одного клиентского прокси, который используется несколькими потоками одновременно (выделение жирным шрифтом в оригинале):

... Однако существует сценарий, в котором установка для параметра ConcurrencyMode значения Multiple в службе PerCall может увеличить пропускную способность для вашей службы, если применяются следующие условия:

  1. Клиент является многопоточным и выполняет вызовы к вашему сервису из нескольких потоков , используя один и тот же прокси .

  2. Связывание между клиентом и службой является связыванием, которое имеет сеанс (например, netTcpBinding, wsHttpBinding w / Reliable Session, netNamedPipeBinding и т. Д.).

Кроме того, доказательства в этом посте противоречат дополнительному замечанию Брайана о том, что WCF сериализует любых многопоточных запросов.В посте показано несколько запросов от одного клиента, выполняющего одновременно - , если используются ConcurrencyMode.Multiple и InstanceContextMode.PerCall.

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

12 голосов
/ 08 июня 2011

Да, это потокобезопасно. Однако вы должны знать, что WCF автоматически сериализует выполнение CalculateSomething, когда он вызывается из более чем одного потока, используя один и тот же экземпляр ClientBase. Поэтому, если вы ожидаете, что CalculateSomething будет работать одновременно, вам придется переосмыслить свой дизайн. Взгляните на этот ответ для одного подхода к созданию асинхронного API для метода CalculateSomething.

3 голосов
/ 07 января 2011

Да, вызов метода на канале является поточно-ориентированным (с точки зрения клиента - с точки зрения сервиса зависит от реализации сервиса) Вы можете вызывать этот метод из нескольких потоков параллельно. Даже автоматически генерирующий прокси предложит вам создать методы для асинхронных вызовов.

0 голосов
/ 28 декабря 2017

Кому это может касаться. Клиентская база WCF может быть поточно-ориентированной, по крайней мере, в этой конфигурации. Я не пробовал другие конфигурации.

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IWcfCallbacksContract), Namespace = "http://wcf.applicatin.srv/namespace")]
public interface IWcfContract
{
    [OperationContract]
    CompositeReturnObject GetServerObject();
}

Услуги:

public CompositeReturnObject GetServerObject()
{
    CompositeReturnObject ret = new CompositeReturnObject("Hello");
    Thread.Sleep(10000); // Simulating long call
    return ret;
}

Клиент:

private void GetData_Click(object sender, RoutedEventArgs e)
{
    Console.WriteLine("Task 1 start: " + DateTime.Now.ToString("HH:mm:ss"));

    Task.Factory.StartNew(() => {
        var res = _proxy.GetServerObject();
        Console.WriteLine("Task 1 finish: " + DateTime.Now.ToString("HH:mm:s"));
        Console.WriteLine(res.ToString());
        return;
    }
    );

    Thread.Sleep(2000);

    Console.WriteLine("Task 2 start: " + DateTime.Now.ToString("HH:mm:ss"));

    Task.Factory.StartNew(() => {
        var res = _proxy.GetServerObject();
        Console.WriteLine("Task 2 finish: " + DateTime.Now.ToString("HH:mm:s"));
        Console.WriteLine(res.ToString());
        return;
    }
    );
}

И результат:

Начало задания 1: 15:47:08
Начало задачи 2: 15: 47: 10

Задание 1 завершено: 15:47:18
Название: Объект один "Привет"

Задание 2 завершено: 15:47:20
Название: Объект один "Привет"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...