/// <summary>
        /// Receives the data
        /// </summary>
        /// <param name="worker">receiver</param>
        /// <param name="source">data source from where we receive the data</param>
        /// <param name="settings">settings</param>
        private async void Receive(IPackageReceiveWorker worker, IReceiveDataSource source, IExchangeSettings settings)
        {
            do
            {
                if (!settings.SilentCancel)
                {
                    _cancellationToken.ThrowIfCancellationRequested();
                }
                // Gets receive package. It should fill in the Buffer with packages
                worker.GetReceivePackage(source, settings);
                var lastDateUpdated = DateTime.Now;
                if (!worker.IsBufferEmpty)
                {
                    var tasks = new List <Task>();
                    for (var i = 0; i < settings.CountThreads; i++)
                    {
                        tasks.Add(ReceiveAction(worker, source));
                    }

                    while (tasks.Count > 0)
                    {
                        var finishedTask = await Task.WhenAny(tasks);

                        tasks.Remove(finishedTask);
                    }
                }
                else
                {
                    var timeOut = (int)(DateTime.Now - lastDateUpdated).TotalMilliseconds;
                    if (timeOut < settings.Timeout)
                    {
                        Thread.Sleep(settings.Timeout - timeOut);
                    }
                }
            } while (!settings.StopServiceAfterFirstRun);
        }
 /// <summary>
 /// Starts receive task
 /// </summary>
 /// <param name="worker">Receiver/Importer</param>
 /// <returns>Receive/Import task</returns>
 private async Task ReceiveAction(IReceiveWorker worker, IReceiveDataSource source)
 {
     await Task.Run(() => worker.Receive(source), _cancellationToken);
 }