2014-03-28 2 views
0

this article에 따르면 OpenXML은 "MemoryStreams 최고점에 도달"하고 IsolatedStorage로 전환해야하는 경우 스레드로부터 안전하지 않습니다.OpenXML Isolated 스토리지 스레딩

UNCOMPRESSED 데이터가 그 크기의 10 배이기 때문에 1MB 미만의 통합 문서에서 발생합니다.

필자는 실제로 xlsx 파일을 동시에, 특히 동시성이있는 비정상적으로 큰 파일을 만들어야합니다. MS 솔루션은 다음과 같은 것을 구현하는 것입니다 (C#에서 변환),하지만 이것으로 무엇을 해야할지 모르겠습니다.

Public Class PackagePartStream 
    Private _stream As Stream 
    Private Shared _m As New Mutex(False) 

    Public Sub New(ByVal Stream As Stream) 
     _stream = Stream 
    End Sub 

    Public Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer 
     Return _stream.Read(buffer, offset, count) 
    End Function 

    Public Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) 
     _m.WaitOne(Timeout.Infinite, False) 
     _stream.Write(buffer, offset, count) 
     _m.ReleaseMutex() 
    End Sub 

    Public Sub Flush() 
     _m.WaitOne(Timeout.Infinite, False) 
     _stream.Flush() 
     _m.ReleaseMutex() 
    End Sub 
End Class 

내 추측은 지금까지이 같은 것입니다하지만 난이 단순화 이상 해요 느낌이와 뮤텍스의 OpenXML의 WriteElement에게

Dim stream As New PackagePartStream() 
Using document As SpreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, True) 
    WriteExcelFile(ds, document) 
End Using 

나는 천국을 처리하는 기능에 더 가깝게 할 필요가 .NET에서 많은 스레딩을 수행했지만, 누군가가 올바른 방향을 가리킬 수 있기를 바랍니다.

답변

1

웹 서버에서 동적 보고서를 작성하는 경우 내 자신의 질문에 대답하는 것이 싫지만 OpenXML SDK를 사용하지 마십시오. 대신에 EPplus를 사용하십시오. IsolagedStorage를 사용하지 않는 대체 패키징 라이브러리를 사용합니다. Microsoft가이 문제를 언급하지 않은 것은 수치스러운 일입니다.