上一篇: C# 匿名方法

下一篇: 没有了

C# 多线程

在本教程中,您将学习如何在 C# 中使用多线程。多线程允许您同时执行多个任务,从而提高程序的性能和响应速度。

基本概念

以下是与 C# 多线程相关的基本概念:

  • 线程(Thread) :操作系统调度和执行的最小单元。
  • 多线程 :同一时间运行多个线程,以实现并发处理。

创建和启动线程

首先,需要引入 System.Threading 命名空间,它包含了用于多线程编程的类。接下来,创建一个简单的方法作为线程要执行的任务:

                using System;
                using System.Threading;

                public class ThreadExample
                {
                    public static void PrintNumbers()
                    {
                        for (int i = 1; i <= 5; i++)
                        {
                            Console.WriteLine(i);
                            Thread.Sleep(1000); // 暂停当前线程1秒钟
                        }
                    }
                }
                

现在,可以创建一个新的 Thread 对象,并将 PrintNumbers 方法作为参数传递给它。然后,调用 Start 方法启动线程。

                class Program
                {
                    static void Main(string[] args)
                    {
                        Thread thread = new Thread(ThreadExample.PrintNumbers);
                        thread.Start();

                        Console.ReadLine();
                    }
                }
                

当线程开始时,它将在后台依次输出数字 1 到 5,每个数字之间暂停 1 秒钟。

使用参数和返回值

要将参数传递给线程方法,可以使用带有一个 object 类型参数的方法。如果需要返回值,可以考虑使用 Task<TResult> 类。

以下是一个计算数值平方的例子:

                public class ThreadExample
                {
                    public static void CalculateSquare(object number)
                    {
                        int value = (int)number;
                        Console.WriteLine($"Square of {value}: {value * value}");
                    }
                }
                

在这个例子中,我们修改了 CalculateSquare 方法以接收一个 object 类型的参数。然后,我们在启动线程时将整数作为参数传递。

                class Program
                {
                    static void Main(string[] args)
                    {
                        Thread thread = new Thread(ThreadExample.CalculateSquare);
                        int number = 5;
                        thread.Start(number);

                        Console.ReadLine();
                    }
                }
                

输出结果:

                Square of 5: 25
                

使用锁(Lock)解决资源竞争问题

当多个线程尝试访问共享资源时,可能会出现资源竞争问题,从而导致数据不一致或程序崩溃。为避免这种情况,可以使用 lock 关键字确保同一时间只有一个线程可以访问共享资源。

以下是一个简单的示例,演示如何使用 lock 保护共享资源:

                public class ThreadExample
                {
                    private static object _lock = new object();
                    private static int _counter = 0;
                    public static void IncreaseCounter()
                    {
                        lock (_lock)
                        {
                            _counter++;
                            Console.WriteLine($"Counter: {_counter}");
                            Thread.Sleep(1000);
                        }
                    }
                }

                class Program
                {
                static void Main(string[] args)
                {
                    Thread thread1 = new Thread(ThreadExample.IncreaseCounter);
                    Thread thread2 = new Thread(ThreadExample.IncreaseCounter);
                    thread1.Start();
                    thread2.Start();

                    thread1.Join();
                    thread2.Join();

                    Console.ReadLine();
                }
                }
                

在这个例子中,我们创建了一个名为 _lock 的对象,并使用 lock 语句确保每次只有一个线程可以访问并修改_counterJoin 方法被用于等待线程完成执行。

结论

在本教程中,您学习了如何在 C# 中使用多线程。请注意,多线程编程可能会导致复杂的问题,因此需要仔细分析和规划。在实际应用中,建议使用高级的并发抽象(如 TaskParallel 类)以简化代码并降低出错风险。