我有一个bool(b
),在我的代码中只出现两次(除了声明之外):
try
{
b = true;
//code including await SomeAsync();
}
catch { }
finally { b = false; }
有时,try块是 已启动 ,b
为true
( - 之前 {{1} })这应该永远不会发生,因为声明离开它b = true
,就像之前的false
一样。在某些时候,这个代码是在一个循环中执行的,在某些情况下它会快速迭代而finally
试图使用太多的内存。我假设这是一个可以"打破"的类型的例外。一个SomeAsync()
。 (finally
始终为b
,只有false
处理的数据量正常时才会出现{。}}。
我已经尝试在SomeAsync()
之后和Debug.WriteLine()
之后验证Visual Studio向我显示try
的内容,并在字符串中添加不同的字符地点,但finally
已执行。所以我认为缓慢的延迟足以防止异常。
这真的有可能吗? (有关如何验证或修复它以便最终始终运行的任何想法?)
(最后阻止可以失败 - 案例:Conditions when finally does not execute in a .net try..finally block)
修改
在评论和答案中提出了一个很好的观点 - 这段代码可能会在finally
期间同时执行多次。不幸的是,还有另一个细节(那些答案让我知道是相关的) - 在所有迭代之后 - 状态是awaits
是b
。 那个不是由并发解释的。我还在true
块之前添加了if (b) return;
(以避免在前一个运行时调用try
)。所有迭代完成后仍然留下Async
true
。
答案 0 :(得分:2)
这是一个非常常见的错误。您展示的代码可以同时运行多次。例如,您将它附加到按钮单击事件,用户可以连续十次单击该按钮,导致该函数的十个副本几乎同时运行。
在这个例子中,他们不会同时运行,与UI线程相关联,但是每次看到<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Border BorderThickness="2" BorderBrush="DarkGoldenrod" Margin="4">
<TreeView x:Name="TreeView" Width="400" Height="800" Focusable="True" VerticalAlignment="Top">
</TreeView>
</Border>
</StackPanel>
时,它们都会与调度程序从一个实例跳到下一个实例重叠言。
如果你在后台运行它(例如Thread.Start),那么每个实例都将获得自己的线程,你真的会同时运行多个副本。