Async two-way communication with Windows Named Pipes (.Net)

后端 未结 3 1215
时光说笑
时光说笑 2020-12-07 22:06

I have a windows service and a GUI that need to communicate with each other. Either can send messages at any time.

I\'m looking at using NamedPipes, but it seems tha

相关标签:
3条回答
  • 2020-12-07 22:34

    Using a single point to accumulate messages (a single pipe in this case) forces you to handle direction of the message yourself too (in addition to that you have to use a system-wide lock for the pipe).

    So use 2 pipes with opposite directions.

    (Another option would be using 2 MSMQ queues).

    0 讨论(0)
  • 2020-12-07 22:41

    Your named pipe stream classes (server or client) have to be constructed with a PipeDirection of InOut. You need one NamedPipeServerStream, probably in your service, which can be shared by an arbitrary number of NamedPipeClientStream objects. Construct the NamedPipeServerStream with the name of the pipe and the direction, and the NamedPipeClientStream with the name of the pipe, the name of the server, and the PipeDirection, and you should be good to go.

    0 讨论(0)
  • 2020-12-07 22:44

    Using WCF you can use duplex named pipes

    // Create a contract that can be used as a callback
    public interface IMyCallbackService
    {
        [OperationContract(IsOneWay = true)]
        void NotifyClient();
    }
    
    // Define your service contract and specify the callback contract
    [ServiceContract(CallbackContract = typeof(IMyCallbackService))]
    public interface ISimpleService
    {
        [OperationContract]
        string ProcessData();
    }
    

    Implement the Service

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
    public class SimpleService : ISimpleService
    {
        public string ProcessData()
        {
            // Get a handle to the call back channel
            var callback = OperationContext.Current.GetCallbackChannel<IMyCallbackService>();
    
            callback.NotifyClient();
            return DateTime.Now.ToString();
        }
    }
    

    Host the Service

    class Server
    {
        static void Main(string[] args)
        {
            // Create a service host with an named pipe endpoint
            using (var host = new ServiceHost(typeof(SimpleService), new Uri("net.pipe://localhost")))
            {
                host.AddServiceEndpoint(typeof(ISimpleService), new NetNamedPipeBinding(), "SimpleService");
                host.Open();
    
                Console.WriteLine("Simple Service Running...");
                Console.ReadLine();
    
                host.Close();
            }
        }
    }
    

    Create the client application, in this example the Client class implements the call back contract.

    class Client : IMyCallbackService
    {
        static void Main(string[] args)
        {
            new Client().Run();
        }
    
        public void Run()
        {
            // Consume the service
            var factory = new DuplexChannelFactory<ISimpleService>(new InstanceContext(this), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/SimpleService"));
            var proxy = factory.CreateChannel();
    
            Console.WriteLine(proxy.ProcessData());
        }
    
        public void NotifyClient()
        {
            Console.WriteLine("Notification from Server");
        }
    }
    
    0 讨论(0)
提交回复
热议问题