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