在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
关键字来等待这个异步操作完成。这样,主线程不会被阻塞,而是可以继续执行其他工作