我有一个使用本机库的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
'try`块在循环中执行,经过一段时间(几个小时)后,我得到“* .exe已停止工作”对话框,其中包含错误模块是我的代码引用的一些本机库的信息。
在开始转储调试之前:我的catch
块没有捕获异常的任何想法,或者为什么UnhandledException
处理程序没有报告任何内容?任何想法如何能够存活本机库抛出的所有异常(在这种情况下,可能只是简单的重试将解决问题)。
(注意我添加了C#标签,因为很可能这不仅仅与F#相关,而是更多的.NET问题。)
(注意二,是的我知道尝试抓住一切不是最好的解决方案:))
答案 0 :(得分:2)
答案 1 :(得分:1)
我的建议:配置文件以查看一个任务消耗了多少内存,然后根据预期的可用内存决定你可以并排运行多少内存。
this article提供了有关如何在TPL中设置并发线程数限制的建议