首页 > 编程语言 >C#中十种常见的开启线程的方式

C#中十种常见的开启线程的方式

时间:2024-07-23 16:08:39浏览次数:6  
标签:场景 Console C# 十种 Task 线程 缺点 优点

            //第1种:Thread类 。使用场景:快速启动执行简单任务。
            //优点:简单易用。提供了直接控制线程的方法,如Start、Suspend、Resume、Abort等。
            //缺点:功能较少,不适合复杂的线程管理;直接管理线程可能导致资源利用率不高或死锁等问题。

            Thread thread = new Thread(() => Console.WriteLine("Hello from a new thread!"));
            thread.Start();


            //第2种:Task并行库。使用场景:需要更好的错误处理和任务管理。
            //优点:提供了丰富的API,如Task.Run、Task.WhenAll、Task.WhenAny等,易于集成和使用;支持更复杂的并发模式,如取消、超时和错误处理。
            //缺点:学习曲线较陡峭,需要掌握异步编程的概念。

            System.Threading.Tasks.Task.Run(() => Console.WriteLine("Task-based asynchronicity!"));

            //第3种:BackgroundWorker组件。使用场景:GUI应用中需要在后台执行任务,同时需要报告进度或处理异常。
            //优点:支持进度更新和取消操作;自动将工作线程上的异常封送到UI线程,便于处理。
            //缺点:较老的技术,可能在未来的.NET版本中逐渐淘汰;功能相对有限,不如Task并行库灵活。

            var backgroundWorker = new System.ComponentModel.BackgroundWorker();
            backgroundWorker.DoWork += (sender, e) => Console.WriteLine("BackgroundWorker in action!");
            backgroundWorker.RunWorkerAsync();

            //第4种:ThreadPool。
            //场景:需要高效利用线程池资源,执行大量短时间的任务。
            //优点:减少了线程创建和销毁的开销;提高了系统的响应性和吞吐量。
            //缺点:控制度较低,不适合长时间运行的任务;可能因为线程池资源耗尽而导致任务等待。

            ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Utilizing the thread pool!"));

            //第5种:Timer类
            //场景:需要周期性执行任务。
            //优点:简单实现周期性任务;可以在指定的时间间隔后执行回调方法。
            //缺点:精度受限于系统计时器;长时间运行可能会导致资源消耗过多。

            var timer = new Timer(state => Console.WriteLine("Timer ticks!"),null,TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));

            //第6种:async和await
            //场景:需要简化异步代码,提高代码的可读性和可维护性。
            //优点:代码更易读易维护;简化了异步编程的复杂性。
            //缺点:需要.NET 4.5或更高版本;可能会导致死锁,特别是在GUI应用中。

            async System.Threading.Tasks.Task DoAsyncWork()
            {
                await System.Threading.Tasks.Task.Run(() => Console.WriteLine("Async/Await in action!"));
            }

            //第7种:Parallel类
            //场景:需要对数据集合进行并行处理,以提高性能。
            //优点:简化了并行代码编写。提供了丰富的并行操作API,如Parallel.For、Parallel.ForEach、Parallel.Sum等。
            //缺点:可能增加线程管理开销;需要考虑数据划分和合并的问题。

            int[] numbers = { 1, 2, 3, 4 };
            long  iResult = 0;
            System.Threading.Tasks.Parallel.For(0, 4, i => { iResult += i; });

            //第8种:ThreadLocal
            //场景:需要线程安全的局部数据存储。
            //优点:线程安全,避免数据竞争;提供了独立的数据副本给每个线程。
            //缺点:管理不当可能导致资源泄露;需要手动清理不再需要的数据副本。

            ThreadLocal<int> localValue = new ThreadLocal<int>(() => 0);
            localValue.Value++; // Each thread increments its own copy

            //第9种:Lazy
            //场景:需要延迟初始化对象,以节省资源或处理耗时的初始化任务。
            //优点:延迟初始化,节省资源;提高了应用的启动速度。
            //缺点:首次访问时可能引入延迟;需要考虑线程安全问题(尽管Lazy<T>本身是线程安全的)。


            Lazy<int> lazyValue = new Lazy<int>(() => {
                Thread.Sleep(1000); // Simulate long initialization.
                return 42;
            });


            //第10种:PLINQ
            //场景:对大数据集进行LINQ查询,并希望利用多核处理器提高查询效率。
            //优点:利用多核处理器提高查询效率;简化了并行查询的编写。
            //缺点:并行执行可能增加线程管理开销;需要考虑数据分区和聚合的策略。

            var nums = System.Linq.Enumerable.Range(0, 10000).AsParallel().Where(x => x % 2 == 0).ToList();

 

标签:场景,Console,C#,十种,Task,线程,缺点,优点
From: https://www.cnblogs.com/apple-hu/p/18318680

相关文章

  • 从代码调用 alembic 命令后,Python 记录器不再记录
    我在代码中使用alembic在应用程序启动时应用数据库迁移。我还使用Python的内置logginglib来登录终端。应用迁移后(或运行任何打印到alembic的命令),我的记录器停止工作。stdout代码:预期输出:importloggingimportalembic.commandfr......
  • 【YashanDB知识库】yac修改参数后关闭数据库hang住
    【标题】yac修改参数后关闭数据库hang住【问题分类】性能优化【关键词】YashanDB,yac,shutdownhang【问题描述】修改yac参数后执行shutdownimmediate,数据库hang住。【问题原因分析】Shutdown操作时,线程在获取gInstance->trigger->sema信号量时卡住。该信号量应由mai......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (下)
    DASCTF2023六月挑战赛|二进制专项PWN(下)1.can_you_find_me检查保护意料之中64位ida逆向只有add,和del功能不能show先看add吧最多申请10个堆块存在off_by_null漏洞,可以考虑unlink来进行堆块重叠del函数就没有UAF漏洞了1.首先想办法泄露出libc地址,因为本题libc是2.27......
  • 一段时间后登录时 Flask 出现 SESSION_COOKIE_NAME 错误
    直到最近,一切都很好,但现在我的网站不断给出“SESSION_COOKIE_NAME”和“NoneType”对象没有属性“修改”错误。但令人感兴趣的是,如果我更改代码,错误如何消失一段时间并不重要。请帮助知识渊博的人这里是代码最重要的部分:importosimportplotly.expressaspximportcs50......
  • c/c++ jsoncpp的基本使用
    一、概述jsoncpp官网作用:在c++中可以方便的组装及解析json格式的数据。二、代码示例voidMyJsonCpp::toJsonStr(){Json::ValuejsonValue;jsonValue["username"]="luoluoyang";jsonValue["password"]="123456";jsonValue["ag......
  • 第一作者解读|我们这篇Nature Communication背后的故事
    2024年7月16日,大暑将至,立秋不远。我们基于Python的转录组学全分析框架的文章——"OmicVerse:aframeworkforbridginganddeepeninginsightsacrossbulkandsingle-cellsequencing"——正式在NatureCommunication上发表了,这是我们课题组第一个里程碑意义的成果,也是我第一......
  • c 使用cJSON生成及解析json类型数据
    一、概述cJSON官网作用:可以在c程序中方便的进行json字符串的解析及生成 二、代码示例//组装一个json串voidCJsonTest::valueToJsonObject(){cJSON*root,*fmt;char*out;root=cJSON_CreateObject();//创建一个obj(申请了堆内存记得释放)......
  • 一个正式项目使用GraalVM进行native compile的启动耗时比较
    环境windows、graalvm(内置有JDK,可以不用再单独下载jdk了)项目pom.xml...<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version>......
  • 学习React(添加交互)
    添加交互        界面上的控件会根据用户的输入而更新。例如,点击按钮切换轮播图的展示。在React中,随时间变化的数据被称为状态(state)。你可以向任何组件添加状态,并按需进行更新。在本章节中,你将学习如何编写处理交互的组件,更新它们的状态,并根据时间变化显示不同的效......
  • NSSCTF-2021年SWPU联合新生赛
    [SWPUCTF2021新生赛]finalrce这道题目考察tee命令和转义符\这题主要是,遇到一种新的符号,"\"—转义符。我理解的作用就是在一些控制字符被过滤的时候,可以用转义符,让控制符失去原本的含义,变为字面量,但是作用不变。目录扫描得到1.txt文件,但是发现里面没有内容,利用tee命令可以......