C# 递归锁(即在同一线程上工作的锁)

C# 递归锁(即在同一线程上工作的锁),c#,.net-2.0,C#,.net 2.0,我希望有一个锁,防止从同一个线程输入代码段,从而使它在无限递归中更加防弹。也就是说,类似于: private static object RecurseLock = new object(); public void PartiallyRecursiveMethod() { if (TryEnter(RecurseLock)) { try { Console.WriteLine("Hello ");

我希望有一个锁,防止从同一个线程输入代码段,从而使它在无限递归中更加防弹。也就是说,类似于:

private static object RecurseLock = new object();
public void PartiallyRecursiveMethod()
{
    if (TryEnter(RecurseLock))
    {
        try
        {
            Console.WriteLine("Hello ");
            // we want to do it again now
            PartiallyRecursiveMethod();
        }
        finally
        {
            Release(RecurseLock);
        }
    }
    Console.WriteLine("world!");
}
这样,调用
PartiallyRecursiveMethod
的输出为“Hello world!”。(或者可能有一个新行,我忘了
Console.WriteLine
是如何工作的)

TryEnter应仅应用于当前线程。不应阻止其他线程

C#中有什么东西已经做到了,还是我必须自己写?我相信所有常见的嫌疑犯(
Monitor.TryEnter
SemaphoreSlim
等)只获得了一个排除不同线程的锁;在这里使用它们只会导致堆栈溢出

这需要在.NET2中


顺便说一句,我知道这个要求表明代码非常糟糕,而且重写代码更明智。尽管如此,我还是对.NET是否提供类似的服务感兴趣。

正如一些人指出的那样,在.NET 2.x中,您可以使用
[ThreadStatic]
来实现以下目的:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            Parallel.Invoke(test, test, test);
        }

        static void test()
        {
            if (_thisThreadAlreadyHere)
            {
                Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is already working.");
                return;
            }

            _thisThreadAlreadyHere = true;

            try
            {
                Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is working.");

                Thread.Sleep(1000);
                test();
                Thread.Sleep(1000);

                Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} has completed.");
            }

            finally
            {
                _thisThreadAlreadyHere = false;
            }
        }

        [ThreadStatic]
        static bool _thisThreadAlreadyHere;
    }
}

然而,我想说的是,试图以这种方式解决“无限递归”问题有些可疑。我本以为应该有更好的方法来修复逻辑-这似乎是一种贴膏药的方法。

你可以使用这个类来解决这个问题。@MSDN的MatthewWatson说:“一个线程可以多次进入信号量”。您是否考虑过具体的实现?一个简单的布尔值将允许您这样做。不需要任何锁机制。@Damien_不相信这听起来是对的,不幸的是,我需要它在.NET2中工作(忘了提到)。将更新问题。@bommelding是的,我知道。然而,我很想知道是否有任何东西是提供给这个案件不管。作为一个模板,这应该有一个尝试,最终防止块被永远锁定,如果有一个例外。但是谢谢你,
ThreadStatic
是我想要的。@Patrick我添加了try/finally,以防其他人用这个答案做任何事情。