如何在C#中实现多线程

在C#中实现多线程有多种方式,包括使用System.Threading.Thread类、System.Threading.Tasks.Task类、System.Threading.Tasks.Parallel类以及异步编程模型(async和await)。下面我将为你展示每种方法的基本用法。

1. 使用System.Threading.Thread类

|---|-----------------------------------------------------------------------------------------------|
| | using System; |
| | using System.Threading; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | Thread thread = new Thread(DoWork); |
| | thread.Start(); // 启动线程 |
| | |
| | // 等待线程完成(可选) |
| | thread.Join(); |
| | |
| | Console.WriteLine("Main thread continuing execution..."); |
| | } |
| | |
| | static void DoWork() |
| | { |
| | for (int i = 0; i < 5; i++) |
| | { |
| | Thread.Sleep(1000); // 暂停1秒 |
| | Console.WriteLine("Worker thread is working... " + DateTime.Now.ToString("HH:mm:ss.fff")); |
| | } |
| | } |
| | } |

2. 使用System.Threading.Tasks.Task类

|---|--------------------------------------------------------------|
| | using System; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static async Task Main() // 注意这里使用了async和Task作为Main的返回类型 |
| | { |
| | Task task = Task.Run(() => DoWork()); // 使用Task.Run启动任务 |
| | |
| | // 等待任务完成(可选,但通常使用await) |
| | await task; // 这里使用await而不是task.Wait(),以避免阻塞主线程 |
| | |
| | Console.WriteLine("Main thread continuing execution..."); |
| | } |
| | |
| | static void DoWork() |
| | { |
| | // ... 同上 ... |
| | } |
| | } |

3. 使用System.Threading.Tasks.Parallel类(并行执行,不是真正的多线程,但用于并行处理数据)

|---|-----------------------------------------------|
| | using System; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | Parallel.Invoke( |
| | () => DoWork("Task 1"), |
| | () => DoWork("Task 2") |
| | ); |
| | |
| | Console.WriteLine("All tasks completed."); |
| | } |
| | |
| | static void DoWork(string taskName) |
| | { |
| | // ... 模拟工作,并输出任务名 ... |
| | } |
| | } |

4. 使用异步编程模型(async和await)

异步编程模型允许你使用同步的语法编写异步代码,使得代码更易于阅读和维护。这通常与Task和Task<TResult>一起使用。

|---|---------------------------------------------------------------------------|
| | using System; |
| | using System.Net.Http; |
| | using System.Threading.Tasks; |
| | |
| | class Program |
| | { |
| | static async Task Main() |
| | { |
| | string content = await FetchDataFromWebAsync(); |
| | Console.WriteLine(content); |
| | } |
| | |
| | static async Task<string> FetchDataFromWebAsync() |
| | { |
| | using (HttpClient client = new HttpClient()) |
| | { |
| | return await client.GetStringAsync("https://example.com"); // 异步获取网页内容 |
| | } |
| | } |
| | } |

在这个例子中,FetchDataFromWebAsync方法使用HttpClient的GetStringAsync方法来异步获取网页内容,并且Main方法使用await关键字来等待这个异步操作完成。这样,主线程不会被阻塞,而是可以继续执行其他工作

相关推荐
apcipot_rain10 小时前
C++转Java日记(04)
java·开发语言·c++
云和数据.ChenGuang12 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
蜗牛一步步往上爬15 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
张张123y17 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
冻柠檬飞冰走茶20 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing0320 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊20 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆67521 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩1 天前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
AI导出鸭PC端1 天前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭