private void StartPipe() { // create named pipe binding _callbackService = new HudNamedPipeBindingCallbackService(); InstanceContext context = new InstanceContext(_callbackService); _namedPipeBindingFactory = new DuplexChannelFactory <IHudNamedPipeBindingService>(context, "HudNamedPipeBindingServiceEndpoint"); _namedPipeBindingProxy = CreateProxyChannel(_namedPipeBindingFactory); while (!hudClient.HasExited) { try { Task.Delay(delayMS).Wait(); if (_cancellationTokenSource != null && _cancellationTokenSource.IsCancellationRequested) { LogProvider.Log.Info(this, "Initialize canceled"); return; } ((IClientChannel)_namedPipeBindingProxy).Open(); if (settingsModel.GeneralSettings.IsAdvancedLoggingEnabled) { LogProvider.Log.Info(this, "Successfully connected to the HUD service."); } return; } catch (EndpointNotFoundException) { LogProvider.Log.Info(this, "Service hasn't been created yet."); ((IClientChannel)_namedPipeBindingProxy).Abort(); ((IClientChannel)_namedPipeBindingProxy).Faulted -= Pipe_Faulted; ((IClientChannel)_namedPipeBindingProxy).Opened -= Pipe_Opened; _namedPipeBindingProxy = CreateProxyChannel(_namedPipeBindingFactory); } catch (Exception ex) { LogProvider.Log.Error(this, ex); } } }
private void Close() { try { if (_initializeTask != null && _initializeTask.Status != TaskStatus.RanToCompletion) { try { _cancellationTokenSource.Cancel(); _initializeTask.Wait(); } catch (Exception ex) { LogProvider.Log.Error(this, ex); } } isInitialized = false; _initializeTask = null; _cancellationTokenSource = null; if (_namedPipeBindingFactory != null) { _namedPipeBindingFactory.Faulted -= Pipe_Faulted; _namedPipeBindingFactory.Opened -= Pipe_Opened; _namedPipeBindingFactory.Abort(); _namedPipeBindingFactory = null; _namedPipeBindingProxy = null; _callbackService = null; } if (hudClient != null && !hudClient.HasExited) { hudClient.Kill(); } } catch (Exception e) { LogProvider.Log.Error(this, "HUD transmitter could not be stopped.", e); } }