跳到主要内容

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#中线程的基础知识,包括线程的创建、管理和同步。多线程编程可以显著提高程序的性能,但也带来了复杂性,特别是在处理共享资源时。掌握这些基础知识是进一步学习并发编程的关键。

附加资源

练习

  1. 修改第一个示例,使主线程和工作线程交替打印消息,但工作线程的打印次数是主线程的两倍。
  2. 尝试使用 Monitor 类替代 lock 语句来实现线程同步。
  3. 编写一个多线程程序,计算1到1000000之间所有素数的数量,并比较单线程和多线程实现的性能差异。