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