/// <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); }