C# 13 引入了新的功能,旨在让编码变得更简单、更高效。其中的一个亮点是通过 System.Threading.Lock
类引入的作用域锁功能。这让线程同步变得更加简单,并减少了多线程程序中的错误。
在本文中,我们将探讨作用域锁的工作原理、它们为何有用以及如何在代码中使用它们。
源代码已上传到GitHub(https://github.com/Prasadnair/LockInCsharp13)。
作用域锁使线程同步的管理更加容易。通过在 using
代码块中使用 Lock.EnterScope()
,锁在代码块结束时会自动释放,即使发生错误也不例外。这有助于防止忘记释放锁,并使同步代码更简单。
Monitor.Enter()
和 Monitor.Exit()
。让我们看一个简单的示例,展示作用域锁在多线程情况下的工作原理。
using System;
using System.Threading;
using System.Threading.Tasks;
classProgram
{
// 定义一个共享锁对象
privatestaticreadonly Lock myLock = new Lock();
// 共享资源
privatestaticint sharedResource = 0;
static async Task Main(string[] args)
{
// 模拟多个任务访问共享资源
var mytask1 = Task.Run(() => AccessSharedResource("任务 1"));
var mytask2 = Task.Run(() => AccessSharedResource("任务 2"));
// 等待两个任务完成
await Task.WhenAll(mytask1, mytask2);
}
static void AccessSharedResource(string taskName)
{
// 使用作用域锁同步访问
using (myLock.EnterScope())
{
Console.WriteLine($"{taskName} 进入锁。");
// 安全地访问和修改共享资源
sharedResource++;
Console.WriteLine($"{taskName} 将共享资源增至 {sharedResource}。");
// 模拟一些工作
Thread.Sleep(1000);
Console.WriteLine($"{taskName} 离开锁。");
}
}
}
Lock.EnterScope()
方法用于代码块中,并在代码块结束时自动释放锁。using
块中发生异常,锁依然会被正确释放。在 C# 13 之前,开发者经常使用 Monitor.Enter()
和 Monitor.Exit()
来管理线程同步。虽然这种方法有效,但存在一些缺点。
lock (lockObject)
{
// 关键区
}
Monitor.Enter()
和 Monitor.Exit()
。lock (lockObject)
{
// 关键区
}
作用域锁非常适合以下情况:
C# 13 中的作用域锁使线程同步更简单、更安全。通过在 using
块中使用 Lock.EnterScope()
,开发者可以编写更简洁、更可靠的多线程代码,减少死锁或同步问题的风险。
如果您正在使用 C# 13,请尝试在项目中使用这一功能,以改进您的多线程逻辑并简化资源管理。
最后Code愉快!
译文:c-sharpcorner.com/blogs/scoped-locks-for-thread-synchronization-in-c-sharp-13