"最后"因为#34中的异步未执行,请尝试"?

时间:2016-06-30 18:44:08

标签: c# .net multithreading async-await uwp

我有一个bool(b),在我的代码中只出现两次(除了声明之外):

try 
{
    b = true;
    //code including await SomeAsync();
}
catch {  }
finally { b = false; }

有时,try块是 已启动 btrue( - 之前 {{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期间同时执行多次。不幸的是,还有另一个细节(那些答案让我知道是相关的) - 在所有迭代之后 - 状态是awaitsb那个不是由并发解释的。我还在true块之前添加了if (b) return;(以避免在前一个运行时调用try)。所有迭代完成后仍然留下Async true

1 个答案:

答案 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),那么每个实例都将获得自己的线程,你真的会同时运行多个副本。