在多线程和并发编程中,同步机制是不可或缺的,它帮助我们控制对共享资源的访问,以及管理线程间的协作。C#提供了多种同步原语,其中SemaphoreSlim
是一个轻量级的同步原语,用于控制访问有限数量的资源。本文将深入探讨SemaphoreSlim
的特点、构造函数、常用方法,并通过实例来展示其用法。
SemaphoreSlim
是.NET Framework中System.Threading命名空间下的一个类,它提供了一个信号量机制,允许多个线程同时访问一定数量的资源。与Semaphore
类相比,SemaphoreSlim
是一个更轻量级的版本,专为需要高性能的场景设计,它主要适用于任务和异步编程。
SemaphoreSlim
提供了一个简单而高效的信号量机制,相较于Semaphore
,它在性能上有所优化,特别是在同一进程内部使用时。SemaphoreSlim
提供了三个构造函数:
SemaphoreSlim
的实例,设置初始的信号量计数。SemaphoreSlim
的实例,设置初始的信号量计数和最大信号量计数。SemaphoreSlim
不直接在构造函数中支持CancellationToken
,但其WaitAsync
方法支持。SemaphoreSlim
使用的所有资源。C#using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(3); // 最多允许3个线程同时访问
static void AccessDatabase(string name, int seconds)
{
Console.WriteLine($"{name} waits to access a database.");
semaphoreSlim.Wait();
Console.WriteLine($"{name} is accessing the database.");
Thread.Sleep(TimeSpan.FromSeconds(seconds)); // 模拟数据库访问
Console.WriteLine($"{name} is done.");
semaphoreSlim.Release();
}
static void Main(string[] args)
{
for (int i = 1; i <= 5; i++)
{
int id = i;
Task.Run(() => AccessDatabase($"Task {id}", id));
}
Console.ReadLine();
}
}
这个例子创建了一个SemaphoreSlim
实例,允许最多3个线程同时访问数据库。通过Wait
和Release
方法,我们控制了对数据库访问的并发数。
C#using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(3); // 最多允许3个任务同时执行
static async Task AccessResourceAsync(string name, int seconds)
{
Console.WriteLine($"{name} waits to access a resource.");
await semaphoreSlim.WaitAsync();
Console.WriteLine($"{name} is accessing the resource.");
await Task.Delay(TimeSpan.FromSeconds(seconds)); // 模拟异步操作
Console.WriteLine($"{name} is done.");
semaphoreSlim.Release();
}
static async Task Main(string[] args)
{
Task[] tasks = new Task[5];
for (int i = 1; i <= 5; i++)
{
int id = i;
tasks[i - 1] = AccessResourceAsync($"Task {id}", id);
}
await Task.WhenAll(tasks);
Console.WriteLine("All tasks have been completed.");
}
}
在这个异步示例中,我们使用WaitAsync
方法替代了Wait
方法,以非阻塞的方式等待信号量。这对于异步编程场景特别有用,因为它避免了在等待时阻塞线程。
SemaphoreSlim
是C#中一个非常有用的同步原语,它提供了一种高效的方式来控制对共享资源的并发访问。通过上述示例,我们可以看到SemaphoreSlim
在同步和异步编程中的应用。掌握SemaphoreSlim
的使用,对于开发高效、可靠的多线程和异步应用程序至关重要。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!