我必须使用 WCF 通过不可靠的连接在计算机之间传输大文件。
因为我希望能够恢复文件并且我不想被 WCF 限制在我的文件大小上,所以我将文件分块为 1MB 块。这些“块”作为流传输。到目前为止,效果很好。
我的步骤是:
- 打开文件流
- 将文件中的块读入 byte[] 并创建 memorystream
- 转移块
- 回到 2. 直到整个文件被发送
我的问题出在第 2 步。我假设当我从字节数组创建内存流时,它将最终出现在 LOH 上并最终导致内存不足异常。我实际上无法创建此错误,也许我的假设是错误的。
现在,我不想在消息中发送 byte[],因为 WCF 会告诉我数组大小太大。我可以更改允许的最大数组大小和/或我的块的大小,但我希望有另一种解决方案。
我的实际问题:
- 我当前的解决方案会在 LOH 上创建对象吗?这会给我带来问题吗?
- 有没有更好的方法来解决这个问题?
顺便说一句:在接收端,我简单地从到达的流中读取较小的块并将它们直接写入文件,因此不涉及大字节数组。
编辑:
当前解决方案:
for (int i = resumeChunk; i < chunks; i++)
{
byte[] buffer = new byte[chunkSize];
fileStream.Position = i * chunkSize;
int actualLength = fileStream.Read(buffer, 0, (int)chunkSize);
Array.Resize(ref buffer, actualLength);
using (MemoryStream stream = new MemoryStream(buffer))
{
UploadFile(stream);
}
}