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 积分,解读结果公开显示在下面。

还没有人解读过这个文件。