private void RemoveFromDownloadingNow(string id)
        {
            string result = id;

            if (!DownloadingNow.TryTake(out result))
            {
                throw new Exception("An exception while removing from DownloadingNow");
            }
        }
        private async Task ManageDownloads()
        {
            try
            {
                if (DownloadingNow.Count < DegreeOfParallelism && DownloadQueue.Count > 0)
                {
                    for (int i = 0; i < degreeOfParallelism - DownloadingNow.Count; i++)
                    {
                        string download;
                        if (DownloadQueue.TryDequeue(out download))
                        {
                            DownloadingNow.Add(download);
                        }
                    }
                }
                if (DownloadingNow.Count > 0)
                {
                    var downloads = DownloadingNow.ToArray();
                    foreach (string id in downloads)
                    {
                        var download = GetFromAllDownloads(id);

                        if (download.DownloadTask.Status == TaskStatus.RanToCompletion || download.DownloadTask.Status == TaskStatus.Faulted)
                        {
                            RemoveFromDownloadingNow(id);
                        }
                        if (download.DownloadTask.Status == TaskStatus.WaitingForActivation)
                        {
                            RunDownloadTask(download.DownloadTask);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                OnDownloaderException?.Invoke(ex);
            }
        }