c# - 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
可能的内部状态。
解决方案
推荐阅读
- python - 如何迭代数据帧行,以更 Python 的方式替换匹配元组中的值?
- git - 是什么导致我在 Github 的 diff 中出现行偏移问题?
- aframe - 未能在元素上执行“setAttribute”
- android-studio - Flutter Hello World 应用程序无法在 Emulator (android studio) 上运行
- javascript - 为什么 Angular cdk 自动填充在 Firefox 中不起作用?
- html - 根据条件删除 detailPanel 会导致填充
- python - 在打印语句中增加一个值
- linux - 在 x86 上发送用户模式中断
- python - 创建新模型后如何自动创建 100 个模型实例?
- jquery - 在所有字段都有效后启用提交按钮