异步与Windows命名管道的双向通信(.NET)(Async two-way communicat

2019-09-02 05:21发布

我有需要相互通信的Windows服务和GUI。 这两者都可以随时发送消息。

我期待在使用了NamedPipes,但似乎你不能阅读和在同一时间写入流(或至少我不能找到覆盖这种情况下,任何的例子)。

是否有可能通过一个单一的NamedPipe做这种双向沟通的? 或者我需要打开两个管道(从一个GUI的>服务和一个由服务 - > GUI)?

Answer 1:

使用WCF,你可以使用双面命名管道

// 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();
}

实现服务

[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();
    }
}

主机服务

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();
        }
    }
}

创建客户端应用程序,在这个例子中,客户端类实现回调合同。

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");
    }
}


Answer 2:

您的命名管道流类(服务器或客户端)必须用的InOut的PipeDirection构造。 你需要一个NamedPipeServerStream,可能在你的服务,它可以通过NamedPipeClientStream对象任意数量的共享。 构建NamedPipeServerStream与管道的名称和方向,并与管道,该服务器的名称的名称NamedPipeClientStream和PipeDirection,你应该是好去。



Answer 3:

使用单点累积的消息(在这种情况下,单管),迫使你处理消息的自己太方向(除,你必须使用管道系统范围的锁)。

因此,使用2管与相反的方向。

(另一种办法是使用2个MSMQ队列)。



文章来源: Async two-way communication with Windows Named Pipes (.Net)