OpenXML IsolatedStorage线程

时间:2014-03-28 16:54:13

标签: vb.net multithreading excel openxml-sdk

根据this article,当“MemoryStreams达到高水位线”并且必须切换到IsolatedStorage时,OpenXML不是线程安全的。

这种情况发生在小于1mb的工作簿上,因为UNCOMPRESSED数据的大小可能是10倍。

我真的需要同时创建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 个答案:

答案 0 :(得分:1)

我讨厌回答我自己的问题,但如果您要在网络服务器上构建动态报告,请不要使用OpenXML SDK。请改用EPplus。它使用不使用IsolagedStorage的替代打包库。很遗憾微软没有解决这个问题。