src/DotNetCommon.Core/AsyncLocker.cs
(开头部分) 4KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DotNetCommon
{
/// <summary>
/// 进程内异步锁 (由于lock关键字、Monitor无法对异步代码块加锁,所以封装了此类,它基于 <seealso cref="SemaphoreSlim"/> 实现),使用示例:<br />
/// <list type="number">
/// <item> 锁代码块: 可设置超时
/// <code>
/// await AsyncLocker.LockAsync("123", async () =>
/// {
/// //somecode ...
/// },TimeSpan.FromSeconds(30));
/// </code>
/// </item>
/// <item> 尝试锁内运行
/// <code>
/// if (!await AsyncLocker.TryLockAsync("123", async () =>
/// {
/// //somecode...
/// }, TimeSpan.FromSeconds(30)))
/// {
/// return Result.NotOk("操作超时,请稍后重试!");
/// }
/// </code>
/// </item>
/// </list>
/// </summary>
public static class AsyncLocker
{
private static readonly ConcurrentDictionary<string, SemaphoreSlim> _lockDic = new ConcurrentDictionary<string, SemaphoreSlim>();
/// <summary>
/// 异步锁
/// <code>
/// await AsyncLocker.LockAsync("123", async () =>
/// {
/// //somecode ...
/// },TimeSpan.FromSeconds(30));
/// </code>
/// </summary>
/// <param name="lockStr"></param>
/// <param name="func"></param>
/// <param name="timespan">超时时间</param>
/// <returns></returns>
/// <exception cref="TimeoutException">获取锁超时</exception>
public static async Task LockAsync(string lockStr, Func<Task> func, TimeSpan? timespan = null)
{
var locker = _lockDic.GetOrAdd(lockStr, key => new SemaphoreSlim(1, 1));
var flag = true;
try
{
if (timespan != null)
{
flag = await locker.WaitAsync(timespan.Value);
后面还有 82 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
