首页 > 解决方案 > AsyncLocal 持有一个堆栈 - 看似可靠的代码会抛出“堆栈为空”。为什么?

问题描述

知道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"
    }
}

抛出异常时,调用堆栈仅在此方法中“深一层”。

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

我的理解在哪里崩溃?不管. AsyncLocal_ Stack<>_finally

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

我没有最小的复制,它似乎是随机发生的。这就是AsyncLocal首先引入的原因 - 以防两个线程参与并破坏了Stack可能的内部状态。

标签: c#stack

解决方案


推荐阅读