我需要在我的應用程序中知道什麼時候動態執行的底層組件會拋出進程損壞的狀態異常,以便我可以記錄它並將該組件標記爲不適合再次加載並使我的過程崩潰。使用Async.Catch處理進程損壞的狀態異常
該組件的執行是異步執行的,我使用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:我發現,指着我使用或者與SecurityCriticalAttribute
HandleProcessCorruptedStateExceptionsAttribute
在一起,或使用一個配置項legacyCorruptedStateExceptionsPolicy=true
的文檔。如果可能的話,我不想使用配置條目。
編輯2:基於在註釋的建議,我修改了出租以「B」的結合如下:
let b = async {
try
let! m = Async.Catch a
return "hello"
with
| :? System.Threading.ThreadAbortException as e -> return "Caught: " + e.ToString()
}
該程序仍然掛起而不返回或投擲。
不回答你的問題,但我懷疑,你可以使用'嘗試/的with'代替'Async.Catch',使您的異步塊更具可讀性。 – kvb
修改了代碼(請參閱EDIT2),仍然是相同的行爲 –
我不指望它解決問題,但我的意思是讓你做'讓! m =返回「hello」'而不是將'Async.Catch'移動到'try'塊中。 – kvb