I'm evaluating thread safety in XlsIO and I have found that the method ExcelEngine.Excel.Workbooks.Open(string filename) does not appear to be thread safe at all :(. Whenever I run just a single thread everything works fine, but as soon as I start adding multiple threads loading files (not even the same file) all sorts of Exceptions are thrown.
Syncfusion.Compression.Zip.ZipException was unhandled
Message=Zip exception.Can't find local header signature - wrong file format or file is corrupt.
Source=Syncfusion.Compression.Base
StackTrace:
at Syncfusion.Compression.Zip.ZipArchiveItem.ReadLocalHeader(Stream stream)
at Syncfusion.Compression.Zip.ZipArchiveItem.ReadData(Stream stream, Boolean checkCrc)
at Syncfusion.Compression.Zip.ZipArchive.ExtractItems(Stream stream)
at Syncfusion.Compression.Zip.ZipArchive.Open(Stream stream, Boolean closeStream)
at Syncfusion.XlsIO.Implementation.XmlSerialization.FileDataHolder..ctor(WorkbookImpl book, Stream stream, String password)
at Syncfusion.XlsIO.Implementation.WorkbookImpl.ParseExcel2007Stream(Stream stream, String password)
at Syncfusion.XlsIO.Implementation.WorkbookImpl.ParseStream(Stream stream, String password, ExcelVersion version, ExcelParseOptions options)
at Syncfusion.XlsIO.Implementation.WorkbookImpl..ctor(IApplication application, Object parent, Stream stream, ExcelParseOptions options, ExcelVersion version)
at Syncfusion.XlsIO.Implementation.ApplicationImpl.CreateWorkbook(Object parent, Stream stream, ExcelVersion version, ExcelParseOptions options)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream, ExcelVersion version, ExcelParseOptions options)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream, ExcelVersion version)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream, ExcelOpenType openType)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream)
at SyncfusionXlsIOTest.Form1.DoThings(Object fileName) in C:\Users\Thomas.EODEV\Documents\Visual Studio 2010\Projects\SyncfusionXlsIOTest\SyncfusionXlsIOTest\Form1.cs:line 93
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart(Object obj)
Or this:
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=Syncfusion.XlsIO.Base
StackTrace:
at Syncfusion.XlsIO.Implementation.XmlSerialization.FileDataHolder.GetXmlReaderByContentType(String strContentType, String& strItemName)
at Syncfusion.XlsIO.Implementation.XmlSerialization.FileDataHolder.ParseArchiveItemByContentType(String strContentType)
at Syncfusion.XlsIO.Implementation.XmlSerialization.FileDataHolder.ParseDocumentProperties()
at Syncfusion.XlsIO.Implementation.XmlSerialization.FileDataHolder.ParseDocument(List`1& themeColors)
at Syncfusion.XlsIO.Implementation.WorkbookImpl.ParseExcel2007Stream(Stream stream, String password)
at Syncfusion.XlsIO.Implementation.WorkbookImpl.ParseStream(Stream stream, String password, ExcelVersion version, ExcelParseOptions options)
at Syncfusion.XlsIO.Implementation.WorkbookImpl..ctor(IApplication application, Object parent, Stream stream, ExcelParseOptions options, ExcelVersion version)
at Syncfusion.XlsIO.Implementation.ApplicationImpl.CreateWorkbook(Object parent, Stream stream, ExcelVersion version, ExcelParseOptions options)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream, ExcelVersion version, ExcelParseOptions options)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream, ExcelVersion version)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream, ExcelOpenType openType)
at Syncfusion.XlsIO.Implementation.Collections.WorkbooksCollection.Open(Stream stream)
at SyncfusionXlsIOTest.Form1.DoThings(Object fileName) in C:\Users\Thomas.EODEV\Documents\Visual Studio 2010\Projects\SyncfusionXlsIOTest\SyncfusionXlsIOTest\Form1.cs:line 93
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart(Object obj)
If I put the call to Workbooks.Open() within a lock statement everything works, indicating that the errors are somehow caused by lack of thread safety..?
Any help with this would be much appreciated!
Regards,
Thomas