当前位置:首页 > 科技  > 软件

多线程技术应用之并行下载并通知运行状态

来源: 责编: 时间:2024-05-29 17:30:59 296观看
导读场景描述:在面对需要下载大量文件或同时执行大量任务的挑战时,多线程技术成为提高效率的关键工具。这种方法就像优化了的生产线,各个部分同步协作,使整体工作更为流畅和迅速。想象一下,你面临一个包含1,000个文件下载或者

zc128资讯网——每日最新资讯28at.com

场景描述:

在面对需要下载大量文件或同时执行大量任务的挑战时,多线程技术成为提高效率的关键工具。这种方法就像优化了的生产线,各个部分同步协作,使整体工作更为流畅和迅速。zc128资讯网——每日最新资讯28at.com

想象一下,你面临一个包含1,000个文件下载或者有多个可以并行处理的任务的时候。在传统的单线程模型中,这将是一个漫长的等待过程。但通过多线程,我们可以将这个大任务拆分成多个小任务并行执行,从而大大缩短完成时间,提高整体效率。zc128资讯网——每日最新资讯28at.com

然而,仅仅完成任务是不够的。为了确保用户和其他相关方实时了解进展情况,我们需要一个高效的进度跟踪和报告机制。这可以通过建立实时监控系统或利用进度条、日志和通知来实现。这样用户,都可以在任何时候了解项目的当前状态和预期进度。zc128资讯网——每日最新资讯28at.com

下面就思考两种实现方式:多线程和并行库的用法。主要是体会使用模型的使用。zc128资讯网——每日最新资讯28at.com

多线程处理实现过程:

示例代码:zc128资讯网——每日最新资讯28at.com

using System;using System.Threading;using System.Threading.Tasks;class Program{    static int currentFile = 0;    static object lockObject = new object();    static void Main(string[] args)    {        const int NUM_FILES = 1000;        const int NUM_THREADS = 20;        // 创建一个计数器,以便在所有线程完成后更新状态。        CountdownEvent countdown = new CountdownEvent(NUM_THREADS);        // 创建20个下载线程        for (int i = 0; i < NUM_THREADS; i++)        {            int threadIndex = i;            Task.Run(() =>            {                // 模拟下载过程                for (int j = threadIndex; j < NUM_FILES; j += NUM_THREADS)                {                    DownloadFile(j);                    ReportProgress(NUM_FILES);  // 报告下载进度                }                // 当前线程完成下载,向计数器发信号。                countdown.Signal();            });        }        // 等待所有线程完成        countdown.Wait();        // 所有线程都已完成,将状态标记为已完成。        Console.WriteLine("所有文件下载已完成!");    }    static void DownloadFile(int fileIndex)    {        // 模拟下载过程        Thread.Sleep(100);   // 假设每个文件需要10毫秒下载        Console.WriteLine($"文件 #{fileIndex} 已下载完毕!");    }    static void ReportProgress(int NUM_FILES)    {        lock(lockObject)        {            int current = Interlocked.Increment(ref currentFile);            Console.WriteLine($"当前进度:{current}/{NUM_FILES}");        }    }}

zc128资讯网——每日最新资讯28at.com

定义常量:NUM_FILES表示总文件数量,这里设定为1000。NUM_THREADS表示线程数量,这里设定为20。zc128资讯网——每日最新资讯28at.com

创建一个CountdownEvent对象countdown,用于在所有线程完成后更新状态。zc128资讯网——每日最新资讯28at.com

创建20个下载线程:zc128资讯网——每日最新资讯28at.com

  • 使用Task.Run()创建一个任务,并在每个任务中执行相应的操作。
  • 每个线程根据索引threadIndex来决定从哪个文件开始下载,通过循环递增NUM_THREADS来实现线程间的文件分配。
  • 在循环中调用DownloadFile()方法来模拟下载文件,并在下载完成后调用ReportProgress()方法报告下载进度。
  • 当线程完成下载后,通过countdown.Signal()向计数器发信号。

使用countdown.Wait()等待所有线程完成。zc128资讯网——每日最新资讯28at.com

所有线程都已完成,输出提示信息:“所有文件下载已完成!”zc128资讯网——每日最新资讯28at.com

DownloadFile()方法模拟文件下载过程:使用Thread.Sleep()方法来模拟下载耗时,这里假设每个文件需要100毫秒下载。输出下载完毕的文件信息。zc128资讯网——每日最新资讯28at.com

ReportProgress()方法用于报告下载进度:zc128资讯网——每日最新资讯28at.com

  • 使用lock语句加锁,确保多个线程同时操作currentFile变量时不会产生竞争条件。
  • 使用Interlocked.Increment()原子地递增currentFile变量,获取当前下载的文件数。
  • 输出当前下载进度信息。

总体而言,该程序通过创建多个线程来并行下载文件,并使用计数器来跟踪所有线程的完成状态。每个线程负责下载部分文件,并在完成后报告当前的下载进度。最后,当所有线程都完成时,输出下载完成的提示信息。
zc128资讯网——每日最新资讯28at.com

使用并行库的处理过程:

示例代码:zc128资讯网——每日最新资讯28at.com

using System;using System.Threading.Tasks;using System.Collections.Concurrent;class Program{    static int currentFile = 0;    static object lockObject = new object();    static void Main(string[] args)    {        const int NUM_FILES = 1000;        // 使用ParallelOptions来跟踪并行任务的进度        var parallelOptions = new ParallelOptions        {            MaxDegreeOfParallelism = 20 // 设置最大并行度        };        // 使用Parallel.ForEach并行下载文件        Parallel.ForEach(            Partitioner.Create(0, NUM_FILES), // 使用分区器创建任务范围            parallelOptions,            (range, loopState) =>            {                for (int j = range.Item1; j < range.Item2; j++)                {                    DownloadFile(j);                    ReportProgress(NUM_FILES);  // 报告下载进度                }            });        // 所有任务完成后输出信息        Console.WriteLine("所有文件下载已完成!");    }    static void DownloadFile(int fileIndex)    {        // 模拟下载过程        Task.Delay(100).Wait(); // 假设每个文件需要100毫秒下载        Console.WriteLine($"文件 #{fileIndex} 已下载完毕!");    }    static void ReportProgress(int NUM_FILES)    {        lock(lockObject)        {            int current = Interlocked.Increment(ref currentFile);            Console.WriteLine($"当前进度:{current}/{NUM_FILES}");        }    }}

zc128资讯网——每日最新资讯28at.com

初始化并行任务:使用并行库,你可以利用Parallel.For或Parallel.ForEach来简化并行任务的创建和管理。这些方法会自动处理任务的分发和管理,无需手动管理线程。zc128资讯网——每日最新资讯28at.com

分发任务:Parallel.For或Parallel.ForEach会根据可用的处理器核心数或任务的工作量自动分发任务。你只需指定任务的起始和结束范围。zc128资讯网——每日最新资讯28at.com

报告进度:由于Parallel类提供了内置的机制来跟踪任务的进度,所以你可能需要使用ParallelOptions和ParallelLoopState来跟踪和报告任务的进度。zc128资讯网——每日最新资讯28at.com

在这个版本中,我们使用Parallel.ForEach来并行处理文件的下载任务。我们使用了Partitioner.Create来创建任务的范围,并使用ParallelOptions来控制并行度。此外,进度报告也被稍微简化,因为Parallel类本身提供了一个更简洁的方法来处理这种情况。zc128资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91525-0.html多线程技术应用之并行下载并通知运行状态

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 服务失败后如何重试?你学会了吗?

下一篇: 被追着问UUID和自增ID做主键哪个好,为什么?

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • OPPO Reno10 Pro英雄联盟定制礼盒公布:萨勒芬妮同款配色梦幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新机,全系标配了超光影长焦镜头,是迄今为止拍照
Top