Мне нужно, чтобы мое приложение знало, когда базовый компонент, который выполняется динамически, вызывает исключение из-за поврежденного состояния процесса, чтобы я мог записать его в журнал и пометить компонент как плохой для повторной загрузки и сбоя моего процесса.
Выполнение этого компонента выполняется асинхронно, и я использую 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 : Основываясь на предложении в комментарии, я изменил привязку let для 'b' следующим образом:
let b = async {
try
let! m = Async.Catch a
return "hello"
with
| :? System.Threading.ThreadAbortException as e -> return "Caught: " + e.ToString()
}
Программа по-прежнему зависает, не возвращаясь и не выбрасывая.