Example #1
0
        /// <summary>
        ///     下载文件方法(自动确定是否使用分片下载)
        /// </summary>
        /// <param name="fileEnumerable">文件列表</param>
        /// <param name="downloadThread">下载线程</param>
        /// <param name="tokenSource"></param>
        /// <param name="downloadParts"></param>
        public static async Task AdvancedDownloadListFile(IEnumerable <DownloadFile> fileEnumerable, int downloadThread,
                                                          CancellationTokenSource tokenSource, int downloadParts = 16)
        {
            var downloadFiles  = fileEnumerable.ToList();
            var token          = tokenSource?.Token ?? CancellationToken.None;
            var processorCount = ProcessorHelper.GetPhysicalProcessorCount();

            if (downloadThread <= 0)
            {
                downloadThread = processorCount;
            }

            using var bc = new BlockingCollection <DownloadFile>(downloadThread * 4);
            using var downloadQueueTask = Task.Run(() =>
            {
                downloadFiles.AsParallel().ForAll(d => bc.Add(d, token));

                bc.CompleteAdding();
            }, token);

            using var downloadTask = Task.Run(async() =>
            {
                void DownloadAction()
                {
                    foreach (var df in bc.GetConsumingEnumerable())
                    {
                        var di = new DirectoryInfo(
                            df.DownloadPath.Substring(0, df.DownloadPath.LastIndexOf('\\')));
                        if (!di.Exists)
                        {
                            di.Create();
                        }

                        if (df.FileSize >= 1048576 || df.FileSize == 0)
                        {
                            MultiPartDownload(df, downloadParts);
                        }
                        else
                        {
                            DownloadData(df).GetAwaiter().GetResult();
                        }
                    }
                }

                var tasks = new Task[downloadThread * 2];

                for (var i = 0; i < downloadThread * 2; i++)
                {
                    tasks[i] = new Task(DownloadAction);
                    tasks[i].Start();
                }

                await Task.WhenAll(tasks).ConfigureAwait(false);
            }, token);

            await Task.WhenAll(downloadQueueTask, downloadTask).ConfigureAwait(false);
        }
Example #2
0
        /// <summary>
        ///     下载文件方法(自动确定是否使用分片下载)
        /// </summary>
        /// <param name="fileEnumerable">文件列表</param>
        /// <param name="downloadThread">下载线程</param>
        /// <param name="tokenSource"></param>
        public static async Task AdvancedDownloadListFile(IEnumerable <DownloadFile> fileEnumerable, int downloadThread,
                                                          CancellationTokenSource tokenSource, int downloadParts = 16)
        {
            var downloadFiles  = fileEnumerable.ToList();
            var token          = tokenSource?.Token ?? CancellationToken.None;
            var processorCount = ProcessorHelper.GetPhysicalProcessorCount();

            if (downloadThread <= 0)
            {
                downloadThread = processorCount;
            }

            using var bc = new BlockingCollection <DownloadFile>(downloadThread * 4);
            using var downloadQueueTask = Task.Run(() =>
            {
                foreach (var df in downloadFiles)
                {
                    bc.Add(df, token);
                }

                bc.CompleteAdding();
            }, token);

            using var downloadTask = Task.Run(() =>
            {
                void DownloadAction()
                {
                    foreach (var df in bc.GetConsumingEnumerable())
                    {
                        var di = new DirectoryInfo(
                            df.DownloadPath.Substring(0, df.DownloadPath.LastIndexOf('\\')));
                        if (!di.Exists)
                        {
                            di.Create();
                        }

                        // DownloadData(df);
                        if (df.FileSize >= 1048576 || df.FileSize == 0) // || df.FileSize == default)
                        {
                            MultiPartDownload(df, downloadParts);
                        }
                        else
                        {
                            DownloadData(df);
                        }
                    }
                }

                var threads = new List <Thread>();

                for (var i = 0; i < downloadThread * 2; i++)
                {
                    threads.Add(new Thread(DownloadAction));
                }

                foreach (var t in threads)
                {
                    t.Start();
                }

                foreach (var t in threads)
                {
                    t.Join();
                }
            }, token);

            await Task.WhenAll(downloadQueueTask, downloadTask).ConfigureAwait(false);
        }