Я бы, наверное, пошел за чем-то вроде счетчика ThreadLocal<T>
, увеличил бы его при колле и уменьшил при уходе. Таким образом, вы можете посчитать, сколько раз он вошел в каждый поток отдельно. Это также намного быстрее, чем сканирование стека. Это также может быть использовано с логическим значением, только для проверки рекурсии.
private ThreadLocal<int> _recursiveCounter = new ThreadLocal<int>(() => 0);
public void MyMethod(int count)
{
_recursiveCounter.Value++;
try
{
if(_recursiveCounter.Value > 2)
Trace.WriteLine($"Recursive exceeds 2 with {_recursiveCounter.Value}");
if(count== 0)
return;
MyMethod(count-1);
}
finally
{
_recursiveCounter.Value--;
}
}
Конечно, вы можете обернуть это в классе и комбинировать его с IDisposable
using(...)
.