private static void BubbleSort(List <PartialDownloader> list)
        {
            bool switched = true;

            while (switched)
            {
                switched = false;
                for (int i = 0; i < list.Count - 1; i++)
                {
                    if (list[i].RemainingBytes < list[i + 1].RemainingBytes)
                    {
                        PartialDownloader temp = list[i];
                        list[i]     = list[i + 1];
                        list[i + 1] = temp;
                        switched    = true;
                    }
                }
            }
        }
        private void temp_DownloadPartCompleted(object sender, EventArgs e)
        {
            WaitOrResumeAll(PartialDownloaderList, true);

            if (TotalBytesReceived == Size)
            {
                UpdateProgress();
                MergeParts();
                return;
            }

            OrderByRemaining(PartialDownloaderList);

            int rem = PartialDownloaderList[0].RemainingBytes;

            if (rem < 50 * 1024)
            {
                WaitOrResumeAll(PartialDownloaderList, false);
                return;
            }

            int from = PartialDownloaderList[0].CurrentPosition + rem / 2;
            int to   = PartialDownloaderList[0].To;

            if (from > to)
            {
                WaitOrResumeAll(PartialDownloaderList, false);
                return;
            }

            PartialDownloaderList[0].To = from - 1;

            WaitOrResumeAll(PartialDownloaderList, false);

            PartialDownloader temp = new PartialDownloader(_url, TempFileDirectory, Guid.NewGuid().ToString(), from, to, true);

            temp.DownloadPartCompleted       += temp_DownloadPartCompleted;
            temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
            PartialDownloaderList.Add(temp);
            temp.Start();
        }
        /// <summary>
        /// 唤醒下载
        /// </summary>
        public void Resume()
        {
            int count = PartialDownloaderList.Count;

            for (int i = 0; i < count; i++)
            {
                if (PartialDownloaderList[i].Stopped)
                {
                    int from = PartialDownloaderList[i].CurrentPosition + 1;
                    int to   = PartialDownloaderList[i].To;
                    if (from > to)
                    {
                        continue;
                    }
                    PartialDownloader temp = new PartialDownloader(_url, TempFileDirectory, Guid.NewGuid().ToString(), from, to, _rangeAllowed);

                    temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
                    temp.DownloadPartCompleted       += temp_DownloadPartCompleted;
                    PartialDownloaderList.Add(temp);
                    PartialDownloaderList[i].To = PartialDownloaderList[i].CurrentPosition;
                    temp.Start();
                }
            }
        }
        void CreateFirstPartitions()
        {
            Size = GetContentLength(_url, ref _rangeAllowed, ref _url);
            int maximumPart = (int)(Size / (25 * 1024));

            maximumPart = maximumPart == 0 ? 1 : maximumPart;
            if (!_rangeAllowed)
            {
                NumberOfParts = 1;
            }
            else if (NumberOfParts > maximumPart)
            {
                NumberOfParts = maximumPart;
            }

            for (int i = 0; i < NumberOfParts; i++)
            {
                PartialDownloader temp = CreateNewPd(i, NumberOfParts, Size);
                temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
                temp.DownloadPartCompleted       += temp_DownloadPartCompleted;
                PartialDownloaderList.Add(temp);
                temp.Start();
            }
        }