C#系列-多线程(4)

在C#中,多线程编程主要涉及使用System.Threading命名空间下的类和接口来创建和管理线程。以下是一些C#多线程编程的基本用法和示例:

1. 使用Thread类创建线程

复制代码
csharp代码

|---|-----------------------------------------------------------------|
| | using System; |
| | using System.Threading; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | // 创建一个新的线程 |
| | Thread newThread = new Thread(new ThreadStart(ThreadFunction)); |
| | |
| | // 启动线程 |
| | newThread.Start(); |
| | |
| | // 等待线程完成 |
| | newThread.Join(); |
| | |
| | Console.WriteLine("Thread completed."); |
| | } |
| | |
| | static void ThreadFunction() |
| | { |
| | Console.WriteLine("Hello from a new thread!"); |
| | } |
| | } |

2. 使用TaskTask<T>类进行异步编程

Task类提供了基于任务的异步编程模型,它是推荐的方式来进行多线程编程,因为它提供了更好的控制和简洁的语法。

复制代码
csharp代码

|---|------------------------------------------|
| | using System; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static async Task Main() |
| | { |
| | Console.WriteLine("Starting a task..."); |
| | |
| | // 启动一个任务 |
| | Task task = Task.Run(() => |
| | { |
| | Console.WriteLine("Hello from a task!"); |
| | }); |
| | |
| | // 等待任务完成 |
| | await task; |
| | |
| | Console.WriteLine("Task completed."); |
| | } |
| | } |

3. 使用Parallel类进行并行编程

Parallel类提供了并行执行循环和操作的功能。

复制代码
csharp代码

|---|----------------------------------------------------------------------------------------|
| | using System; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | // 使用Parallel.For并行执行循环 |
| | Parallel.For(0, 10, i => |
| | { |
| | Console.WriteLine($"Processing {i} on thread {Thread.CurrentThread.ManagedThreadId}"); |
| | }); |
| | } |
| | } |

4. 使用asyncawait关键字进行异步编程

async和await关键字使得异步编程更加简单和直观。

复制代码
csharp代码

|---|------------------------------------------------------------------|
| | using System; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static async Task Main() |
| | { |
| | Console.WriteLine("Starting an asynchronous operation..."); |
| | |
| | // 调用一个异步方法 |
| | int result = await PerformAsyncOperation(); |
| | |
| | Console.WriteLine($"Operation completed with result: {result}"); |
| | } |
| | |
| | static async Task<int> PerformAsyncOperation() |
| | { |
| | // 模拟一个异步操作 |
| | await Task.Delay(1000); |
| | |
| | return 42; // 返回结果 |
| | } |
| | } |

5. 使用ThreadPool

线程池(ThreadPool)是.NET Framework提供的一个线程管理机制,它允许你请求一个线程来执行一些任务,而不需要自己创建和管理线程。

复制代码
csharp代码

|---|-------------------------------------------------------|
| | using System; |
| | using System.Threading; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | // 将任务排入线程池队列 |
| | ThreadPool.QueueUserWorkItem(o => |
| | { |
| | Console.WriteLine("Hello from the thread pool!"); |
| | }); |
| | |
| | Console.WriteLine("Task queued to the thread pool."); |
| | } |
| | } |

6. 使用CancellationToken进行取消操作

在多线程编程中,可能需要取消正在进行的长时间运行的操作。CancellationToken和CancellationTokenSource类提供了取消操作的功能。

复制代码
csharp代码

|---|--------------------------------------------------------------|
| | using System; |
| | using System.Threading; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | // 创建一个取消令牌源 |
| | CancellationTokenSource cts = new CancellationTokenSource(); |
| | |
| | // 启动一个可取消的任务 |
| | Task task = Task.Run(() => DoWork(cts.Token), cts.Token); |
| | |
| | // 在一段时间后取消任务 |
| | Thread.Sleep(2000); |
| | cts.Cancel(); |
| | } |
| | |
| | static void DoWork(CancellationToken token) |
| | { |
| | for (int i = 0; i < 10; i++) |
| | { |
| | token.ThrowIfCancellationRequested(); |
| | |
| | // 模拟工作 |
| | Thread.Sleep(500); |
| | Console.WriteLine($"Working... {i}"); |
| | } |
| | } |
| | } |

在以上示例中,我们展示了如何在C#中使用不同的类和方法来创建和管理多线程应用程序。选择哪种方法取决于你的具体需求,例如任务的性质(I/O密集型还是CPU密集型

相关推荐
杜子不疼.4 分钟前
《Python学习之文件操作:从入门到精通》
数据库·python·学习
★YUI★7 分钟前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
TDengine (老段)27 分钟前
TDengine IDMP 高级功能(4. 元素引用)
大数据·数据库·人工智能·物联网·数据分析·时序数据库·tdengine
谷宇.1 小时前
【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
游戏·unity·c#·游戏程序·unity3d·游戏开发·游戏编程
DashVector1 小时前
如何通过Java SDK分组检索Doc
java·数据库·面试
LZQqqqqo1 小时前
C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
windows·c#·list
Olrookie1 小时前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
苏婳6661 小时前
【最新版】怎么下载mysqlclient并成功安装?
数据库·python·mysql
Tapdata3 小时前
《实时分析市场报告 2025》上线 | 从批处理到实时洞察,2025 年全球实时分析市场全景解读
数据库
海梨花3 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存