public Task Start(CancellationTokenSource source) { _log.Verbose("Starting {0}...", FriendlyName.ToLowerInvariant()); _external = source; _internal = new CancellationTokenSource(); Task = Task.Factory.StartNew(() => { try { _log.Debug("{0} started.", FriendlyName); var linked = CancellationTokenSource.CreateLinkedTokenSource(_external.Token, _internal.Token); if (!_worker.Run(linked.Token).GetAwaiter().GetResult()) { _external.Cancel(); } } catch (OperationCanceledException) { _log.Verbose("{0} aborted.", FriendlyName); } catch (Exception ex) { _log.Error("{0}: {1} ({2})", FriendlyName, ex.Message, ex.GetType().FullName); _external.Cancel(); } finally { _log.Debug("{0} stopped.", FriendlyName); } }, TaskCreationOptions.LongRunning); return(Task); }