예제 #1
0
        public static T UseNamedPipeKernelServer <T>(this T kernel, string pipeName, DirectoryInfo workingDir) where T : Kernel
        {
            if (kernel is null)
            {
                throw new ArgumentNullException(nameof(kernel));
            }

            if (string.IsNullOrWhiteSpace(pipeName))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(pipeName));
            }

            var serverStream = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

            Task.Run(() =>
            {
                serverStream.WaitForConnection();
                var kernelCommandAndEventPipeStreamReceiver = new KernelCommandAndEventPipeStreamReceiver(serverStream);
                var kernelCommandAndEventPipeStreamSender   = new KernelCommandAndEventPipeStreamSender(serverStream);
                var kernelServer = new KernelServer(kernel, kernelCommandAndEventPipeStreamReceiver,
                                                    kernelCommandAndEventPipeStreamSender, workingDir);
                var _ = kernelServer.RunAsync();
                kernel.RegisterForDisposal(kernelServer);
                kernel.RegisterForDisposal(serverStream);
            });
            return(kernel);
        }
    protected override Task <IDisposable> ConnectHostAsync(CompositeKernel remoteKernel, string pipeName)
    {
        var serverStream = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
        var kernelCommandAndEventPipeStreamReceiver = new KernelCommandAndEventPipeStreamReceiver(serverStream);
        var kernelCommandAndEventPipeStreamSender   = new KernelCommandAndEventPipeStreamSender(serverStream);
        var host = new KernelHost(remoteKernel,
                                  kernelCommandAndEventPipeStreamSender,
                                  new MultiplexingKernelCommandAndEventReceiver(kernelCommandAndEventPipeStreamReceiver));



        Task.Run(() =>
        {
            // required as waiting connection on named pipe server will block
            serverStream.WaitForConnection();
            var _ = host.ConnectAsync();
        });
        RegisterForDisposal(host);
        return(Task.FromResult <IDisposable>(host));
    }