【发布时间】:2016-11-03 00:20:42
【问题描述】:
我有一个 bool (b),它在我的代码中只出现了两次(除了它的声明):
try
{
b = true;
//code including await SomeAsync();
}
catch { }
finally { b = false; }
但有时 try 块 开始 时 b 是 true (-之前 b = true) 这不应该是发生是因为声明离开它false,就像之前的finally 一样。在某些时候,此代码在循环中执行,在某些情况下迭代速度很快,SomeAsync() 试图使用过多的内存。我认为这是引发可以“破坏”finally 的类型的异常。 (b 始终是 false,当只有正常数量的数据供 SomeAsync() 处理时。)
我已经尝试验证 Visual Studio 在try 和finally 之后使用Debug.WriteLine() 向我显示的内容,并且还通过在这些位置附加一个不同字符的字符串,然后是finally 被执行。所以我认为缓慢的延迟足以防止异常。
这真的可能吗? (关于如何验证或修复它以使 finally 始终运行的任何想法?)
(最终阻止 可以 失败 - 案例:Conditions when finally does not execute in a .net try..finally block)
编辑
在评论和答案中提出了一个很好的观点——这段代码可能会在awaits 期间同时执行多次。不幸的是,还有另一个细节(这些答案让我意识到是相关的)——在所有迭代之后——状态是b 是true。 那不能用并发来解释。我还在try 块之前添加了一个if (b) return;(以避免在前一个运行时调用Async)。在所有迭代完成后,仍然留下true b。
【问题讨论】:
-
如果
b = true是 try 块中的第一行,它将始终运行,因为b = true不会失败。try块一直运行直到失败。 -
@EliSadoff 这是
true在那一行之前。 -
“我认为这是导致异常的原因” - 什么异常?
-
您是否有可能调用a re-entrant way 中的函数?所以它还在等待
await SomeAsync()完成它被第二次调用? -
为了解决你的问题,如果你有一个任务永远不会完成,那会导致它被卡住,但因为它是异步的,你不能说任何事情是错误的。如果您想要比猜测更好的答案,我们真的需要一个完整的示例,我们可以将其复制并粘贴到我们的机器上以查看行为。
标签: c# .net multithreading async-await uwp