コード例 #1
0
        public ChiefWorkerProcess(
            ILog log,
            ServerSettingsBase workerSettings)
        {
            _log = log;
            _settings = workerSettings;
            Name = _settings.SourceSettings.Name;

            _logReceiverPipe = new AnonymousPipeServerStream(PipeDirection.In, HandleInheritability.Inheritable);
            _logReceiverThread = new Thread(LogReceiverThreadJob)
                {
                    IsBackground = true
                };

            _process = new Process
                {
                    EnableRaisingEvents = true,
                    StartInfo =
                        {
                            FileName = Path.Combine(
                                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                "IpCamEmu Console.exe"),
                            UseShellExecute = false,
                            ErrorDialog = false,
                            CreateNoWindow = true
                        }
                };
            _process.Exited += delegate { _process = null; };

            _launchProcessThread = new Thread(LaunchWorkerThreadJob)
                {
                    IsBackground = true
                };
        }
コード例 #2
0
        /// <summary>
        /// Reading by worker settings Chief passed.
        /// </summary>
        /// <param name="workerSettingsPipeHandle">Settings pipe handler.</param>
        /// <param name="workerLogPipe">Log redirector setting.</param>
        /// <param name="workerSettings">Worker settings.</param>
        /// <param name="chiefProcess">Chief process.</param>
        public static void ReadSettings(
            string workerSettingsPipeHandle,
            
            out ILog workerLogPipe,
            out ServerSettingsBase workerSettings,
            out Process chiefProcess)
        {
            using (var workerControlPipe = new AnonymousPipeClientStream(PipeDirection.In, workerSettingsPipeHandle))
            {
                var binaryReader = new BinaryReader(workerControlPipe);
                workerLogPipe = new AnonymousPipeClientStreamLog(binaryReader.ReadString());
                chiefProcess = Process.GetProcessById(binaryReader.ReadInt32());
                workerLogPipe.Open();

                workerSettings = (ServerSettingsBase)new BinaryFormatter().Deserialize(workerControlPipe);
                binaryReader.Dispose(); // because it closes underlying stream.
            }
        }
コード例 #3
0
        /// <summary>
        /// Sends settings from chief to worker process via anonymous control pipe.
        /// </summary>
        /// <param name="afterSettingsPipeCreated">Invoked with settings pipe handler, so the child worker process can be launched there with with handler as command line argument.</param>
        /// <param name="chiefLogReceiverPipe">Log receiver pipe settings to transfer.</param>
        /// <param name="workerSettings">Worker settings to transfer.</param>
        /// <param name="chiefProcess">Chief process.</param>
        /// <remarks>
        /// Method has 10 seconds timeout for worker process to connect to pipe and read settings.
        /// That is used to avoid blocking with controlPipe.WaitForPipeDrain() in case client failed to read settings or disconnected in the middle of sending message.
        /// </remarks>
        internal static void SendSettings(
            Action<string> afterSettingsPipeCreated,
            
            AnonymousPipeServerStream chiefLogReceiverPipe,
            ServerSettingsBase workerSettings,
            Process chiefProcess)
        {
            using (var chiefSettingsPipe = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable))
            {
                afterSettingsPipeCreated(chiefSettingsPipe.GetClientHandleAsString());

                var binaryWriter = new BinaryWriter(chiefSettingsPipe);
                binaryWriter.Write(chiefLogReceiverPipe.GetClientHandleAsString());
                binaryWriter.Write((Int32)chiefProcess.Id);

                new BinaryFormatter()
                    .Serialize(chiefSettingsPipe, workerSettings);

                Thread.Sleep(10000);
                chiefSettingsPipe.DisposeLocalCopyOfClientHandle();
                binaryWriter.Dispose(); // because it disposes underlying stream.
            }
        }