大约有 1000 个任务正在运行,但有时我会收到任务计划程序抛出的以下内存不足异常。
可能是什么原因以及如何避免它。
System.Threading.Tasks.TaskSchedulerException: An exception was thrown by a TaskScheduler. ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark)
at System.Threading.Thread.Start(StackCrawlMark& stackMark)
at System.Threading.Thread.Start(Object parameter)
at System.Threading.Tasks.ThreadPoolTaskScheduler.QueueTask(Task task)
at System.Threading.Tasks.Task.ScheduleAndStart(Boolean needsProtection)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ScheduleAndStart(Boolean needsProtection)
at System.Threading.Tasks.Task.InternalStartNew(Task creatingTask, Object action, Object state, CancellationToken cancellationToken, TaskScheduler scheduler, TaskCreationOptions options, InternalTaskOptions internalOptions, StackCrawlMark& stackMark)
at System.Threading.Tasks.TaskFactory.StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
at App.StartReadSocketTask()
您的(非 x64)应用程序的最大内存空间为 2GB。每个线程至少需要 1 MB,通常在达到 1000 个线程之前可能会出现 OOM。
Task 类本身应该解决这个问题(通过使用 ThreadPool)。但是,当您的任务花费太长时间(> 500 毫秒)时,TP 将缓慢添加线程,并在几分钟或更长时间后失败。
最简单的解决方案可能是在代码中查看发生无限制创建任务的位置,并查看是否可以以与您的解决方案一致的方式进行限制。就像您使用生产者/消费者队列一样,将其设为有界队列。
否则,限制 MaxThreads,但这是一个生硬的、应用程序范围的工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)