C# 线程基础
介绍
在C#中,线程是程序执行的最小单元。多线程编程允许你同时运行多个线程,从而提高程序的性能和响应能力。理解线程的基础知识是掌握并发编程的关键。
什么是线程?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程有自己的执行路径。
创建线程
在C#中,你可以使用 System.Threading.Thread
类来创建和管理线程。以下是一个简单的示例,展示了如何创建并启动一个线程:
csharp
using System;
using System.Threading;
class Program
{
static void Main()
{
// 创建一个新线程
Thread thread = new Thread(DoWork);
// 启动线程
thread.Start();
// 主线程继续执行其他任务
for (int i = 0; i < 5; i++)
{
Console.WriteLine("主线程: " + i);
Thread.Sleep(500);
}
}
static void DoWork()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("工作线程: " + i);
Thread.Sleep(500);
}
}
}
输出示例
主线程: 0
工作线程: 0
主线程: 1
工作线程: 1
主线程: 2
工作线程: 2
主线程: 3
工作线程: 3
主线程: 4
工作线程: 4
在这个示例中,主线程和工作线程交替执行,展示了多线程的基本行为。
线程同步
当多个线程访问共享资源时,可能会出现竞争条件。为了避免这种情况,C# 提供了多种同步机制,如 lock
语句、Monitor
类、Mutex
等。
以下是一个使用 lock
语句的示例:
csharp
using System;
using System.Threading;
class Program
{
private static object lockObject = new object();
private static int sharedResource = 0;
static void Main()
{
Thread thread1 = new Thread(IncrementResource);
Thread thread2 = new Thread(IncrementResource);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.WriteLine("共享资源的值: " + sharedResource);
}
static void IncrementResource()
{
for (int i = 0; i < 100000; i++)
{
lock (lockObject)
{
sharedResource++;
}
}
}
}
输出示例
共享资源的值: 200000
在这个示例中,lock
语句确保了 sharedResource
的原子性操作,避免了竞争条件。
实际案例:多线程下载器
假设你需要编写一个多线程下载器,可以同时下载多个文件。以下是一个简化的示例:
csharp
using System;
using System.Net;
using System.Threading;
class Program
{
static void Main()
{
string[] urls = { "http://example.com/file1.zip", "http://example.com/file2.zip" };
foreach (var url in urls)
{
Thread thread = new Thread(() => DownloadFile(url));
thread.Start();
}
}
static void DownloadFile(string url)
{
using (WebClient client = new WebClient())
{
string fileName = url.Substring(url.LastIndexOf('/') + 1);
client.DownloadFile(url, fileName);
Console.WriteLine("下载完成: " + fileName);
}
}
}
在这个案例中,每个文件下载任务都在一个独立的线程中执行,从而提高了下载效率。
总结
通过本文,你了解了C#中线程的基础知识,包括线程的创建、管理和同步。多线程编程可以显著提高程序的性能,但也带来了复杂性,特别是在处理共享资源时。掌握这些基础知识是进一步学习并发编程的关键。
附加资源
练习
- 修改第一个示例,使主线程和工作线程交替打印消息,但工作线程的打印次数是主线程的两倍。
- 尝试使用
Monitor
类替代lock
语句来实现线程同步。 - 编写一个多线程程序,计算1到1000000之间所有素数的数量,并比较单线程和多线程实现的性能差异。