WCF с именованными каналами: как разрешить параллельные вызовы? - PullRequest
0 голосов
/ 24 апреля 2020

это мой первый подход к WCF и именованным каналам.

Мне нужно windows прослушивать именованный канал, в то время как маленький GUI сообщает, что делать через канал.

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

I Я пытался создать 2 разных канала для 2 запросов, и он делает то, что мне нужно, но, конечно, это не решение.

Я использую. NET Framework 4.0, и я не могу его изменить.

Вот мой пример кода:

СЕРВИС: конфигурация канала

ServiceHost host = new ServiceHost(typeof(CommandReceiver), new Uri[] {new Uri("net.pipe://localhost") });            
host.AddServiceEndpoint(typeof(ICommandReceiver), new NetNamedPipeBinding(), "myPipe");
host.Open();

СЕРВИС: Интерфейс и реализация контракта

[ServiceContract]
public interface ICommandReceiver
{
    [OperationContract]
    string Foo();

    [OperationContract]
    string Bar();
}

public class CommandReceiver : ICommandReceiver
{
    public string Foo()
    {
        //Do stuffs
        System.Threading.Thread.Sleep(3000);
        return "FOO";
    }

    public string Bar()
    {
        //Do stuffs
        System.Threading.Thread.Sleep(3000);
        return "BAR";
    }
}

КЛИЕНТ: конфигурация канала

ChannelFactory<ICommandReceiver> pipeFactory = new ChannelFactory<ICommandReceiver>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/myPipe"));
ICommandReceiver serviceProxy = pipeFactory.CreateChannel();

КЛИЕНТ: позвоните в службу

public string GetFoo() 
{
    return serviceProxy.Foo();
}
public string GetBar() 
{
    return serviceProxy.Bar();
}

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

Большое спасибо заранее!

1 Ответ

0 голосов
/ 27 апреля 2020

ОК, я решил это: во-первых, мне не хватало следующего атрибута в классе реализации моего контракта:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class CommandReceiver : ICommandReceiver
{
  public string Foo()
  {
    //Do stuffs
    System.Threading.Thread.Sleep(3000);
    return "FOO";
  }

  public string Bar()
  {
    //Do stuffs
    System.Threading.Thread.Sleep(3000);
    return "BAR";
  }
}

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

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