SharpMap System.AccessViolationException
Я использую SharpMap в оконном сервисе. Я использую библиотеку для создания карты, а затем создать из нее изображение и добавить его в файл Excel. Код выполняется в рамках задачи Quartz.net.
Ошибка происходит когда я звоню SharpMap.Map.GetMap()
и сокрушает мой сервис (см. отчет об ошибке и вызов стека ниже).
Это происходит только время от времени (может быть, проблемы с данными?). Также обратите внимание, у меня были некоторые проблемы с работой с картой, поэтому я поставил некоторую задержку (System.Threading.Thread.Sleep(5000);
) непосредственно перед вызовом функции.
Я генерирую несколько таких изображений, и ошибка (в последний раз, когда это произошло) была после нескольких (~10) итераций. Чтобы не воссоздавать и форматировать "статические слои" карты (SharpMap.Map
) каждый раз я просто добавляю и удаляю "динамические" слои и изменяю размеры некоторых функций в каждой итерации.
Есть ли способ найти причину ошибки?
Есть ли способ изящно обработать такое исключение?
Отчет об ошибках Windows CMS + трассировка стека:
Приложение: NePTune.WinService.exe
Версия Framework: v4.0.30319
Описание: процесс был прерван из-за необработанного исключения.
Информация об исключении: System.AccessViolationException
стек:
at System.Drawing.SafeNativeMethods+Gdip.GdipPathIterNextSubpathPath(System.Runtime.InteropServices.HandleRef, Int32 ByRef, System.Runtime.InteropServices.HandleRef, Boolean ByRef)
at System.Drawing.SafeNativeMethods+Gdip.GdipPathIterNextSubpathPath(System.Runtime.InteropServices.HandleRef, Int32 ByRef, System.Runtime.InteropServices.HandleRef, Boolean ByRef)
at System.Drawing.Drawing2D.GraphicsPathIterator.NextSubpath(System.Drawing.Drawing2D.GraphicsPath, Boolean ByRef)
at SharpMap.Rendering.Symbolizer.WarpPathToPath.Warp(System.Drawing.Drawing2D.GraphicsPath, System.Drawing.Drawing2D.GraphicsPath, Boolean, Single)
at SharpMap.Rendering.Symbolizer.WarpPathToPath.DrawString(System.Drawing.Graphics, System.Drawing.Pen, System.Drawing.Brush, System.String, System.Drawing.FontFamily, Int32, Single, System.Drawing.StringFormat, Boolean, System.Drawing.Drawing2D.GraphicsPath)
at SharpMap.Layers.LabelLayer.Render(System.Drawing.Graphics, SharpMap.Map)
at SharpMap.Map.RenderMap(System.Drawing.Graphics)
at SharpMap.Map.GetMap()
at NePTune.Logic.Algorithms.UlInterference.UlInterferenceReportWriter.CreateClusterMap(System.Collections.Generic.List1<NePTune.Data.SectorGeoDetails>, System.Collections.Generic.Dictionary2<Int32,Double>, Int32, System.Collections.Generic.IEnumerable1<NePTune.Data.SectorGeoDetails>, Boolean)
at NePTune.Logic.Algorithms.UlInterference.UlInterferenceReportWriter.CreateInterferenceClusterWorksheets(OfficeOpenXml.ExcelPackage, System.Collections.Generic.List1<NePTune.Logic.Algorithms.UlInterference.UlInterferenceCluster>, System.Collections.Generic.Dictionary2<Int32,NePTune.Data.SectorGeoDetails>, System.Collections.Generic.Dictionary2<Int32,NePTune.Logic.Algorithms.UlInterference.CellMeasurementList>)
at NePTune.Logic.Algorithms.UlInterference.UlInterferenceReportWriter.CreateReport(System.Collections.Generic.List1<NePTune.Logic.Algorithms.UlInterference.CellUlInterferenceResults>, System.Collections.Generic.List1<NePTune.Logic.Algorithms.UlInterference.UlInterferenceCluster>, System.Collections.Generic.Dictionary2<Int32,NePTune.Data.SectorGeoDetails>, System.Collections.Generic.Dictionary2<Int32,NePTune.Logic.Algorithms.UlInterference.CellMeasurementList>)
at NePTune.Logic.Algorithms.UlInterference.UlInterferenceDriver.Execute(NePTune.Common.Configuration.GlobalConfiguration, NePTune.Logic.Algorithms.UlInterference.UlInterferenceConfiguration)
at NePTune.Logic.Algorithms.AlgorithmJobs.UlInterferenceJob.Execute(NePTune.Common.Configuration.GlobalConfiguration, NePTune.Logic.Algorithms.Common.IAlgorithmConfiguration, System.String, System.String, System.String)
at NePTune.Logic.Algorithms.AlgorithmJobs.UlInterferenceJob.Execute(Quartz.IJobExecutionContext)
at Quartz.Core.JobRunShell.Run()
at Quartz.Simpl.SimpleThreadPool+WorkerThread.Run()
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()
1 ответ
Я обсуждал это на странице проекта SharpMap на CodePlex ( https://sharpmap.codeplex.com/), и там они предложили клонировать карту перед вызовом, чтобы получить карту.
Я немного изменил код, чтобы сделать клон карты в каждой итерации, прежде чем добавлять свои "динамические слои", а затем вызывать GetMap()
,
Это предотвращает нарушение доступа.
Подробности смотрите здесь: https://sharpmap.codeplex.com/discussions/558218