Подтвердить что ты не робот

WCF - канал factory против клиентской базы

Я новичок в WCF. Сначала я создал службу WCF и использовал сгенерированный клиентский прокси, чтобы использовать эту услугу у клиента. Поэтому всякий раз, когда я выполнял некоторые операции над сервисом, все выполнялось последовательно, так как я вызываю операции синхронно. Я изменил режим concurrency на несколько, но все же операции выполнялись синхронно. Затем я сгенерировал асинхронные методы для своих операций и использовал начальные/конечные шаблоны, поэтому я предполагаю, что "освободил" канал, и пусть операции происходят параллельно/асинхронно увеличивая пропускную способность моих приложений.

Затем я использовал ChannelFactory для создания канала и выполнил операции, так как клиент и сервер могут совместно использовать контракты (тот же проект). Но IClientChannel предоставляет только BeginOpen/EndOpen/BeignClose/EndClose. Он не имеет методов ClientBase BeginOperation/EndOperation. Поэтому в принципе я не могу выполнить операцию асинхронно на канале, чтобы освободить, чтобы я мог использовать канал для выполнения других операций.

Я просто создал каналы для каждой операции и решил проблему

Итак, мой вопрос:

  • Что лучше (ClientBase vs. ChannelFactory) w.r.t для моего сценария, особенно я хочу выполнять несколько операций над объектом службы одновременно с несколькими потоками

  • Желательно ли создать канал для каждой операции?

  • Фактически, я думал, что у нас может быть только один канал между двумя конечными точками (клиент/сервис). Но я могу создать столько каналов, сколько захочу. Например: я смог создать Int16.MaxValue каналов. Поэтому не уверен, какой предел и рекомендации по этому поводу.

    Service[] channels = new IService[Int16.MaxValue];
    
    for(int i = 0; i<Int16.MaxValue; i++)
    {
       channels[i] = factory.CreateChannel();
    }
    

Так что в основном вы можете сообщить мне об основах каналов и рекомендациях и трюках и т.д. и т.д.:)

4b9b3361

Ответ 1

Существует разница с использованием async между ClientBase и ChannelFactory<T>. В основном ClientBase использует асинхронную модель, управляемую событиями.

Я широко использовал ChannelFactory<T> в приложении, которое я разработал на работе, главным образом потому, что контракты были доступны в общей библиотеке для приложения, и мне не нравится использовать ссылку Add Service Reference. Я кэширую каждый уникальный экземпляр ChannelFactory при создании, а затем, когда мне нужно вызвать операцию, я открою канал связи из этого экземпляра, сделаю свой вызов и закрою канал связи.

Большая часть затрат на запуск WCF заключается в создании клиента, и таким образом вы платите только один раз за жизнь приложения - создание каналов связи тривиально.

Подробнее о async для ClientBase и ChannelFactory<T> см. ниже:

Как выполнить асинхронный вызов служб WCF

Как выполнять асинхронные операции с использованием канала Factory