У меня есть приложение на F #, использующее собственные библиотеки.

Примерно код выглядит так

let exceptionHandler (sender:obj) (e:UnhandledExceptionEventArgs) =
    let msg = (e.ExceptionObject :?> Exception).Message
    printfn "An unhandled exception in \n Message:%s" msg
    Environment.Exit(1)

AppDomain.CurrentDomain.UnhandledException.AddHandler (new UnhandledExceptionEventHandler(exceptionHandler))



[|(*Some array*)|]
|> Array.map (fun (_) -> Task.Factory.StartNew(fun () ->
try
   (* a lot of native libraries calls  that can fail with a bunch of exceptions *)
with
   | ex -> printfn "%s" ex.Message))
|> Task.WaitAll

Блок «Попробовать» выполняется в цикле, и через некоторое время (пару часов) я получаю диалоговое окно «* .exe перестало работать» с информацией о том, что неисправный модуль - это некоторая собственная библиотека, на которую ссылается мой код.

Прежде чем я начну с отладки дампа: есть идеи, почему мой блок catch не перехватил исключение или почему обработчик UnhandledException ничего не сообщил? Любые идеи, как я могу пережить все исключения, созданные собственными библиотеками (в этом случае, вероятно, простая повторная попытка решит проблему).

(Обратите внимание, что я добавил тег C #, потому что, скорее всего, это связано не только с F #, а скорее с проблемой .NET).

(Примечание II, да, я в курсе, что попытаться поймать все - не лучшее решение :))

1
Klark 18 Мар 2014 в 17:49

2 ответа

Лучший ответ

Мое предложение: профилируйте, чтобы увидеть, сколько памяти потребляется одной задачей, а затем решить (на основе ожидаемого объема доступной памяти), сколько вы можете запускать бок о бок.

эта статья дает советы о том, как установить ограничение на количество одновременных потоков в TPL.

1
Chris Ballard 18 Мар 2014 в 14:12

Некоторые исключения не могут быть обнаружены, StackOverflowException - одно из них.

.NET также позволяет завершить процесс с помощью Environment.FailFast метод

Вам нужно будет сбросить отладку, чтобы быть уверенным в том, что происходит.

2
Guish 18 Мар 2014 в 14:11