上一篇: 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
语句确保每次只有一个线程可以访问并修改_counter
。Join
方法被用于等待线程完成执行。
结论
在本教程中,您学习了如何在 C# 中使用多线程。请注意,多线程编程可能会导致复杂的问题,因此需要仔细分析和规划。在实际应用中,建议使用高级的并发抽象(如 Task
和 Parallel
类)以简化代码并降低出错风险。