Ejemplo n.º 1
0
        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);
        }