首页 > 编程语言 >C#十种多线程模式介绍/对比

C#十种多线程模式介绍/对比

时间:2024-07-25 13:54:04浏览次数:15  
标签:场景 Console C# 十种 System 优点 线程 缺点 多线程

 

一、Thread类:最直接的方式开启线程最直接的方式是使用System.Threading.Thread类。这种方式简单明了,适合快速启动线程执行简单任务。

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

使用场景:快速启动执行简单任务。优点:简单易用。缺点:功能较少,不适合复杂的线程管理。

二、Task并行库:现代并发的首选System.Threading.Tasks.Task是.NET并发编程的现代选择,它提供了更丰富的API和更好的异常处理。

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

使用场景:需要更好的错误处理和任务管理。优点:丰富的API,易于集成。缺点:学习曲线较陡峭。

三、BackgroundWorker组件:GUI应用的良伴对于Windows Forms或WPF应用,System.ComponentModel.BackgroundWorker组件可以异步执行操作并报告进度。

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

使用场景:GUI应用中需要在后台执行任务。优点:支持进度更新和取消操作。缺点:较老的技术,功能有限。

四、ThreadPool:高效的线程池利用System.Threading.ThreadPool允许我们使用.NET框架的线程池,高效地执行任务。

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

使用场景:需要高效利用线程池资源。优点:高效,减少线程创建和销毁的开销。缺点:控制度较低,不适合长时间运行的任务。

五、Timer类:周期性任务的定时执行System.Threading.Timer可以在指定的时间间隔后执行任务,适合周期性工作。

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

使用场景:需要周期性执行任务。优点:简单实现周期性任务。缺点:精度受限于系统计时器。

六、async和await:异步编程的新范式使用async和await关键字可以写出更易于阅读和维护的异步代码。

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

使用场景:需要简化异步代码。优点:代码更易读易维护。缺点:需要.NET 4.5或更高版本。

七、Parallel类:数据并行处理System.Threading.Tasks.Parallel类可以简化数据并行处理的代码。

int[] numbers = { 1, 2, 3, 4 };int sum = Parallel.Sum(numbers);

使用场景:需要对数据集合进行并行处理。优点:简化并行代码编写。缺点:可能增加线程管理开销。

八、ThreadLocal:线程局部存储System.Threading.ThreadLocal<T>为每个线程提供独立的数据副本。

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

使用场景:需要线程安全的局部数据存储。优点:线程安全,避免数据竞争。缺点:管理不当可能导致资源泄露。

九、Lazy:惰性初始化System.Lazy<T>可以在需要时才初始化对象,适合耗时的初始化任务。

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

使用场景:需要延迟初始化。优点:延迟初始化,节省资源。缺点:首次访问时可能引入延迟。

十、PLINQ:并行LINQ并行LINQ(PLINQ)可以并行执行LINQ查询,提高数据查询效率。

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

使用场景:对大数据集进行LINQ查询。优点:利用多核处理器提高查询效率。缺点:并行执行可能增加线程管理开销。

 

标签:场景,Console,C#,十种,System,优点,线程,缺点,多线程
From: https://www.cnblogs.com/flamesky/p/18322839

相关文章

  • [题解]CF117C Cycle
    思路发现最简单的方法就是直接枚举三个点,但是复杂度\(\Theta(n^3)\)无法接受。考虑枚举一个点,并确定它的一条边,那么只需要再枚举一个点了。于是转化为了,对于每一个点找到其最好的出边。观察下图,\(a\toc\)的边是不必要的。因为,如果有一个三元环包含\(a\toc\),那么一定能......
  • Vivotek CC8160 栈溢出漏洞复现
    漏洞文件https://github.com/Vu1nT0tal/IoT-vulhub/tree/master/VIVOTEK/remote_stack_overflow另需文件arml内核,文件系统,arm-gdbserver,initrd。https://people.debian.org/~aurel32/qemu/armel/启动qemu-systemqemu-system-arm-Mversatilepb-kernelvmlinuz-3.2.0-4-v......
  • 进程注入-ptrace实现代码注入
    ptrace简介ptrace是一个系统调用,使用过Linux系统多多少少会接触方便我们查看执行的程序的系统调用的strace命令或者编程时使用gdb进行程序调试。他们幕后原理工作其实就是ptrace完成的。我们通过manptrace命令可以查看ptrace的使用说明。ptrace系统调从名字上看是用于进程跟踪......
  • can环境模拟+重放攻击+逆向分析
    安装ICSimsudoaptinstalllibsdl2-devlibsdl2-image-devcan-utilsmavenautoconf-y#下载ICSimgitclonehttps://github.com/zombieCraig/ICSim.git#编译安装cdICSim/sudomake安装socketcand#下载socketcandgitclonehttps://github.com/linux-can/socket......
  • CVE-2018-5767 tenda固件栈溢出漏洞
    路由器固件型号:TendaAC1515.03.1.16_multi固件下载地址:https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1binwalk分离binwalk-MeUS-bin漏洞点:在squashfs-root/bin/httpd可以通过readelf-hhttpd来查......
  • 华为路由器漏洞CVE-2017-17215
    固件获取https://github.com/Vu1nT0tal/IoT-vulhub/tree/master/HUAWEI/CVE-2017-17215/firmware提取binwalk-MerHG532eV100R001C01B020_upgrade_packet.bin启动qemu-systemsudoqemu-system-mips-Mmalta-kernelvmlinux-3.2.0-4-4kc-malta-hdadebian_wheezy_mips......
  • C#.NET工行开放平台RSA私钥公钥生成小工具V2024
    C#.NET工行开放平台RSA私钥公钥生成小工具V2024 开发环境:.NETFRAMEWORK4.0rsatool.exe,来自于工行开发文档。 主要代码:stringthisAppPath=Application.StartupPath;stringexePath=Path.Combine(thisAppPath,"tools");stringexeFullName=Path.Combine(exePa......
  • 需要帮助来提取此 XML 节点 - Python 中的 Excel 连接字符串
    我有一个Python程序,打开Excel(XLSX)文件,并尝试查找<connection>节点。这是connections.xml文件中的完整XML。<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><connectionsxmlns="http://schemas.op......
  • LeetCode 864. Shortest Path to Get All Keys
    原题链接在这里:https://leetcode.com/problems/shortest-path-to-get-all-keys/description/题目:Youaregivenan mxn grid grid where:'.' isanemptycell.'#' isawall.'@' isthestartingpoint.Lowercaselettersrepresentkeys.U......
  • 如何在 Brawl Stars 中使用 game.brawlstarsgame.com 主机和 9339 端口?
    需要使用套接字连接:主机:game.brawlstarsgame.com端口:9339主机可以接受什么参数、以什么形式?我的主要目标是为大量帐户创建一个自动注册器。我理解你想创建一个BrawlStars帐户的自动注册器,并希望利用你提供的game.brawlstarsgame.com主机和9339端口的信息。......