我们有这样的使用场景,某个订单在修改信息的时候,其他人不能修改相关的信息,比如不能做支付,不能退单等等,那么我们可以根据单号进行加锁,多Monitor做了如下扩展

定义接口

//// 文件名称:ILockExt.cs
//// 创建日期:2018-06-07 10:44:39
// 功能描述:自定义锁接口
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.ConstrainedExecution;
using System.Text;

namespace Km.Utils.Helpers
{
    /// <summary>
    /// 功能描述:自定义锁接口
    ////// 创建日期:2018-06-07 10:41:47
    ////// </summary>
    public interface ILockExt : IDisposable
    {
        /// <summary>
        /// 功能描述:在指定对象上获取排他锁。
        ////// 创建日期:2018-06-07 10:25:29
        ////// </summary>
        /// <param name="obj">在其上获取监视器锁的对象</param>
        void Enter(object obj);

        /// <summary>
        /// 功能描述:获取指定对象上的排他锁,并自动设置一个值,指示是否获取了该锁。
        ////// 创建日期:2018-06-07 10:27:21
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <param name="lockTaken">尝试获取锁的结果,通过引用传递。输入必须为 false。如果已获取锁,则输出为true</param>
        void Enter(object obj, ref bool lockTaken);

        /// <summary>
        /// 功能描述:释放指定对象上的排他锁
        ////// 创建日期:2018-06-07 10:36:51
        ////// </summary>
        /// <param name="obj">在其上释放锁的对象</param>
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        void Exit(object obj);

        /// <summary>
        /// 功能描述:通知等待队列中的线程锁定对象状态的更改。
        ////// 创建日期:2018-06-07 10:37:15
        ////// </summary>
        /// <param name="obj">线程正在等待的对象</param>
        void Pulse(object obj);

        /// <summary>
        /// 功能描述:通知所有的等待线程对象状态的更改。
        ////// 创建日期:2018-06-07 10:37:40
        ////// </summary>
        /// <param name="obj">发送脉冲的对象</param>
        void PulseAll(object obj);

        /// <summary>
        /// 功能描述:尝试获取指定对象的排他锁
        ////// 创建日期:2018-06-07 10:37:55
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象。</param>
        /// <returns>如果当前线程获取该锁,则为 true;否则为 false。</returns>
        bool TryEnter(object obj);

        /// <summary>
        /// 功能描述:在指定的毫秒数内尝试获取指定对象上的排他锁。
        ////// 创建日期:2018-06-07 10:38:11
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="millisecondsTimeout">等待锁所需的毫秒数</param>
        /// <returns>如果当前线程获取该锁,则为 true;否则为 false。</returns>
        bool TryEnter(object obj, int millisecondsTimeout);

        /// <summary>
        /// 功能描述:在指定的毫秒数内尝试获取指定对象上的排他锁。
        ////// 创建日期:2018-06-07 10:38:34
        ////// </summary>
        /// <param name="obj">obj</param>
        /// <param name="lockTaken">lockTaken</param>
        void TryEnter(object obj, ref bool lockTaken);

        /// <summary>
        /// 功能描述:在指定的时间量内尝试获取指定对象上的排他锁。
        ////// 创建日期:2018-06-07 10:39:28
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="timeout">System.TimeSpan,表示等待锁所需的时间量。值为 -1 毫秒表示指定无限期等待。</param>
        /// <returns>如果当前线程在不阻止的情况下获取该锁,则为 true;否则为 false</returns>
        bool TryEnter(object obj, TimeSpan timeout);

        /// <summary>
        /// 功能描述:在指定的毫秒数中,尝试获取指定对象上的排他锁,并自动设置一个值,指示是否获取了该锁
        ////// 创建日期:2018-06-07 10:40:54
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="millisecondsTimeout">等待锁所需的毫秒数</param>
        /// <param name="lockTaken">尝试获取锁的结果,通过引用传递。输入必须为 false。如果已获取锁,则输出为 true;否则输出为 false。即使在尝试获取锁的过程中发生异常,也会设置输出。</param>
        void TryEnter(object obj, int millisecondsTimeout, ref bool lockTaken);

        /// <summary>
        /// 功能描述:在指定的一段时间内,尝试获取指定对象上的排他锁,并自动设置一个值,指示是否获取了该锁。
        ////// 创建日期:2018-06-07 11:12:21
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="timeout">用于等待锁的时间。值为 -1 毫秒表示指定无限期等待</param>
        /// <param name="lockTaken">尝试获取锁的结果,通过引用传递。输入必须为 false。如果已获取锁,则输出为 true;否则输出为 false。即使在尝试获取锁的过程中发生异常,也会设置输出。</param>
        void TryEnter(object obj, TimeSpan timeout, ref bool lockTaken);

        /// <summary>
        /// 功能描述:释放对象上的锁并阻止当前线程,直到它重新获取该锁。
        ////// 创建日期:2018-06-07 11:12:45
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <returns> 如果调用由于调用方重新获取了指定对象的锁而返回,则为 true。如果未重新获取该锁,则此方法不会返回。</returns>
        bool Wait(object obj);

        /// <summary>
        /// 功能描述:释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。
        ////// 创建日期:2018-06-07 11:13:13
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <param name="millisecondsTimeout">线程进入就绪队列之前等待的毫秒数</param>
        /// <returns>如果在指定的时间过期之前重新获取该锁,则为 true;如果在指定的时间过期之后重新获取该锁,则为 false。此方法只有在重新获取该锁后才会返回。</returns>
        bool Wait(object obj, int millisecondsTimeout);

        /// <summary>
        /// 功能描述:释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。
        ////// 创建日期:2018-06-07 11:13:35
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <param name="timeout">System.TimeSpan,表示线程进入就绪队列之前等待的时间量。</param>
        /// <returns>如果在指定的时间过期之前重新获取该锁,则为 true;如果在指定的时间过期之后重新获取该锁,则为 false。此方法只有在重新获取该锁后才会返回。</returns>
        bool Wait(object obj, TimeSpan timeout);

        /// <summary>
        /// 功能描述:释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。此方法还指定是否在等待之前退出上下文的同步域(如果处于同步上下文中的话)然后重新获取该同步域。
        ////// 创建日期:2018-06-07 11:14:02
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <param name="millisecondsTimeout">线程进入就绪队列之前等待的毫秒数</param>
        /// <param name="exitContext"> 如果在等待前退出并重新获取上下文的同步域(如果在同步上下文中),则为 true;否则为 false。</param>
        /// <returns>如果在指定的时间过期之前重新获取该锁,则为 true;如果在指定的时间过期之后重新获取该锁,则为 false。此方法只有在重新获取该锁后才会返回。</returns>
        bool Wait(object obj, int millisecondsTimeout, bool exitContext);

        /// <summary>
        /// 功能描述:释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。可以在等待之前退出同步上下文的同步域,随后重新获取该域。
        ////// 创建日期:2018-06-07 11:14:34
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <param name="timeout">System.TimeSpan,表示线程进入就绪队列之前等待的时间量</param>
        /// <param name="exitContext"> 如果在等待前退出并重新获取上下文的同步域(如果在同步上下文中),则为 true;否则为 false。</param>
        /// <returns>如果在指定的时间过期之前重新获取该锁,则为 true;如果在指定的时间过期之后重新获取该锁,则为 false。此方法只有在重新获取该锁后才会返回。</returns>
        bool Wait(object obj, TimeSpan timeout, bool exitContext);



        /// <summary>
        /// 功能描述:在指定对象上获取排他锁
        ////// 创建日期:2018-06-07 10:09:25
        ////// </summary>
        /// <param name="obj">在其上获取监视器锁的对象</param>     
        /// <returns>ILockExt对象</returns>
        ILockExt EnterLock(object obj);
        /// <summary>
        /// 功能描述:获取指定对象上的排他锁,并自动设置一个值,指示是否获取了该锁。
        ////// 创建日期:2018-06-07 10:10:02
        ////// </summary>
        /// <param name="obj">要在其上等待的对象</param>
        /// <param name="lockTaken">尝试获取锁的结果,通过引用传递。输入必须为 false。如果已获取锁,则输出为 true;否则输出为 false。即使在尝试获取锁的过程中发生异常,也会设置输出。Note如果没有发生异常,则此方法的输出始终为true</param>
        /// <returns>ILockExt对象</returns>
        ILockExt EnterLock(object obj, ref bool lockTaken);
        /// <summary>
        /// 功能描述:尝试获取指定对象上的排他锁,并自动设置一个值,指示是否获取了该锁。
        ////// 创建日期:2018-06-07 10:17:29
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="lockTaken">尝试获取锁的结果,通过引用传递。输入必须为 false。如果已获取锁,则输出为 true;否则输出为 false。即使在尝试获取锁的过程中发生异常,也会设置输出。</param>
        /// <returns>返回值</returns>
        ILockExt TryEnterLock(object obj, ref bool lockTaken);
        /// <summary>
        /// 功能描述:在指定的毫秒数内尝试获取指定对象上的排他锁。
        ////// 创建日期:2018-06-07 10:14:36
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="millisecondsTimeout">等待锁所需的毫秒数</param>
        /// <param name="lockTaken">如果当前线程获取该锁,则为 true;否则为 false</param>
        /// <returns>ILockExt对象</returns>
        ILockExt TryEnterLock(object obj, int millisecondsTimeout, ref bool lockTaken);
        /// <summary>
        /// 功能描述:在指定的时间量内尝试获取指定对象上的排他锁。
        ////// 创建日期:2018-06-07 10:15:50
        ////// </summary>
        /// <param name="obj">在其上获取锁的对象</param>
        /// <param name="timeout"> System.TimeSpan,表示等待锁所需的时间量。值为 -1 毫秒表示指定无限期等待。</param>
        /// <param name="lockTaken">如果当前线程获取该锁,则为 true;否则为 false</param>
        /// <returns>ILockExt对象</returns>
        ILockExt TryEnterLock(object obj, TimeSpan timeout, ref bool lockTaken);
    }
}
View Code

相关文章:

  • 2021-11-16
  • 2021-09-26
  • 2021-11-15
  • 2021-09-30
  • 2022-01-14
  • 2022-01-05
  • 2022-12-23
猜你喜欢
  • 2021-10-01
  • 2021-10-11
  • 2022-12-23
  • 2022-03-10
  • 2022-01-20
  • 2022-12-23
  • 2021-09-29
相关资源
相似解决方案