我知道这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可能的内部状态。