Может быть, код, начинающийся с кода, будет проще сформулировать вопрос:
public class RecorderScope : IDisposable
{
[ThreadStatic]
private static RecorderScope current;
public static RecorderScope Current => current;
public RecorderScope()
{
if (current != null) throw new Exception("usually by design, don't make complex stuff");
current = this;
}
public void Dispose()
{
current = null;
}
}
Это означает, что какой-то другой класс может проверить, используется ли он в RecorderScope, и что-то сделать с этим фактом. Он используется только в модульных тестах, предназначен для простых случаев, поэтому мне нет дела до вложенности, и т. Д. c. - но модульные тесты могут выполняться параллельно, следовательно, [ThreadStatic]
.
Теперь он работает нормально, пока в этой области нет ожидания. Я сделал некоторые записи и, похоже, проблема в том, что в конструктор приходит поток с идентификатором x, а для удаления приходит поток с идентификатором y (как и ожидалось, именно так работает асин c), следовательно, значение потока x остается не утилизированным.
Есть идеи как это исправить?