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

Другие вопросы по тегам