C#中的多线程编程允许程序同时执行多个任务,提高程序的效率和响应速度。以下是C#多线程基础的一些关键概念和使用方法:

1. Thread 类

C#中最直接的多线程方式是使用 System.Threading.Thread 类。以下是一个简单的多线程示例:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Thread thread1 = new Thread(ThreadProc);
        thread1.Start("Thread 1"); // 启动线程并传递参数

        Console.WriteLine("Main thread does its work.");
    }

    static void ThreadProc(object data)
    {
        string threadName = (string)data;
        Console.WriteLine($"{threadName} is running.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
2. Task Parallel Library (TPL)

从 .NET 4.0 开始,推荐使用 Task 类和 Task Parallel Library (TPL) 来进行多线程编程,因为它们提供了更高级的并行编程模型,更容易使用且更高效。

使用 Task 示例:
using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        Task task1 = Task.Run(() => RunTask("Task 1"));
        Console.WriteLine("Main thread continues while Task 1 runs.");

        task1.Wait(); // 等待任务完成
        Console.WriteLine("All tasks completed.");
    }

    static void RunTask(string name)
    {
        Console.WriteLine($"{name} is running.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
3. 并行循环 Parallel.ForEach 和 Parallel.For

对于集合的并行处理,可以使用 Parallel.ForEachParallel.For 方法。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        Parallel.ForEach(numbers, number =>
        {
            Console.WriteLine($"Processing number: {number}");
        });

        Console.WriteLine("All numbers processed.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
4. 线程同步

在多线程环境中,为了防止数据竞争和不一致,需要使用同步机制,如 lock, Monitor, Mutex, Semaphore, Interlocked 等。

lock 示例:
private static object _lock = new object();

static void ThreadSafeMethod()
{
    lock (_lock)
    {
        // 临界区代码
        Console.WriteLine("Thread Safe Operation");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
5. 异步编程

C#还提供了 async/await 关键字来进行异步编程,这在处理I/O密集型操作(如网络请求、文件读写)时特别有效,可以提高应用程序的响应性。

async Task AsyncExample()
{
    await Task.Delay(1000); // 模拟异步操作
    Console.WriteLine("Async operation completed.");
}

static async Task Main(string[] args)
{
    await AsyncExample();
    Console.WriteLine("Main completed.");
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.