当线程在到达锁定语句时等待时记录

Tio*_*ion 2 c# locking plinq task-parallel-library system.reactive

当线程到达时,是否有一种快速记录线程正在等待锁定的方法

lock(x)
{
  //do work on a collection

}
Run Code Online (Sandbox Code Playgroud)

如果线程1到达锁定,并且块中没有另一个线程,则应该没有日志.然后,如果线程2到达锁(x)并且线程1仍然在块中,则应该有一个日志.理想的解决方案不需要切换到互斥锁或监视器会增加复杂性.如果有一种快速简便的方法可以使用TPL,PLINQ或RX来做到这一点,那就太棒了.

dtb*_*dtb 10

您可以lock语句进行除糖并使用Monitor.TryEnter来检查是否可以在不等待的情况下获取锁定:

bool lockTaken = false;
var obj = x;
try
{
    Monitor.TryEnter(obj, ref lockTaken);
    if (!lockTaken)
    {
        Log();
        Monitor.Enter(obj, ref lockTaken);
    }
    //do work on a collection
}
finally
{
    if (lockTaken)
    {
        Monitor.Exit(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)