【发布时间】:2011-09-01 06:52:32
【问题描述】:
我需要在我的应用程序中了解动态执行的底层组件何时引发进程损坏状态异常,以便我可以记录它,并将组件标记为无法再次加载并使我的进程崩溃。
此组件的执行是异步执行的,我正在使用 Async.Catch 来处理该异常。我尝试了以下代码来测试 Async.Catch 的行为,在我看来 Async.Catch 已挂起。这对我来说是一种不良影响,我怀疑所有 PCSE 都会导致相同的行为。
有人知道如何摆脱这种情况吗?
let a = async {
System.Threading.Thread.CurrentThread.Abort()
}
let b = async {
let! m = Async.Catch a
return match m with
| Choice1Of2 p -> "hello"
| Choice2Of2 e -> "Caught: " + e.ToString()
}
Async.RunSynchronously b;;
编辑 1:我找到了指向我使用 HandleProcessCorruptedStateExceptionsAttribute 和 SecurityCriticalAttribute 或使用配置条目 legacyCorruptedStateExceptionsPolicy=true 的文档。如果可能的话,我不想使用配置条目。
编辑 2:根据评论中的建议,我修改了 'b' 的 let 绑定如下:
let b = async {
try
let! m = Async.Catch a
return "hello"
with
| :? System.Threading.ThreadAbortException as e -> return "Caught: " + e.ToString()
}
程序仍然挂起,不返回也不抛出。
【问题讨论】:
-
不是您问题的答案,但我怀疑您可以使用
try/with而不是Async.Catch来使您的异步块更具可读性。 -
修改了代码(见EDIT2),还是一样的行为
-
我不希望它解决问题,但我的意思是让你做
let! m = a return "hello",而不是将Async.Catch移动到try块中。 -
避免拨打
Thread.Abort,过上更长寿、更幸福的生活。 stackoverflow.com/questions/421389/…
标签: exception-handling asynchronous f#