AsyncLocal拿着一个堆栈-看似稳定的代码抛出“堆栈为空”。为什么?

Kie*_*one 8 c# stack

知道AsyncLocal很棘手。但是,我什至不能100%肯定会受到谴责。我不明白下面的代码是不是“气密”的。

private readonly AsyncLocal<Stack<int>> _myStack = new AsyncLocal<Stack<int>>();

private void MyMethod()
{
    var myStack = _myStack.Value ?? (_myStack.Value = new Stack<int>());
    myStack.Push(42);
    try
    {
        // code here, which may recursively call the same function again.
        // all single-threaded without any async calls, though
    }
    finally
    {
        myStack.Pop(); // this occasionally throws "Stack empty"
    }
}
Run Code Online (Sandbox Code Playgroud)

引发异常时,此方法中的调用堆栈仅“深”。

没有对的其他引用_myStack,并且myStack(本地var)没有向下传递或在其他任何地方使用。

我的理解在哪里分解?无论使用哪种方式AsyncLocal,我都会抓住一个Stack<>对象,向其推入一些东西-无论发生什么情况,都只在其中弹出一次finally

没有其他异常抛出-堆栈根本不深(在这种情况下为1或2,可能是3个级别)。没有非托管代码。

我没有最低限度的复制,而且似乎随机发生。这就是为什么AsyncLocal首先要引入它的原因-以防万一有两个线程介入并破坏了Stack可能的内部状态。