如何在不使用字节缓冲区的情况下从HttpWebRequest / WebResponse读取文件?

时间:2018-01-05 15:30:02

标签: c# .net memory-management httpwebrequest filestream

我目前正在使用 public MyPanel(boolean[][] newGrid) { grid = newGrid; //Represents an image with 8-bit RGBA color components packed into integer pixels. image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_ARGB); imageG = image.createGraphics(); //Set the single pixel line color to YELLOW using BufferedImage instance imageG.setColor(Color.YELLOW); } public void paintComponent(Graphics g) { super.paintComponent(g); Integer cellWidth = this.getWidth() / grid.length; Graphics2D tempg = (Graphics2D) g; //Set the blocks and rest of it part to color RED tempg.setColor(Color.RED); for (Integer i = 0; i < grid.length + 1; i++) { imageG.drawLine(i * cellWidth, 0, i * cellWidth, this.getHeight()); } tempg.fillRect(0, 0, this.getWidth(), this.getHeight()); //Draw BufferedImage tempg.drawImage(image, 0, 0, this); //this.getGraphics().drawImage(lineImage, 0, 0, this); } / HttpWebRequest来读取根据可用内存和同时下载次数确定的长度字节数组,然后使用WebResponse来把它写到文件中 鉴于即使大型阵列超出范围,也不会从内存中清除 - 可能在相当长的时间内,我希望将数据直接转移到FileStream以完全消除对字节数组的需要。
当然,另一种选择是手动拨打FileStream,但我确信人们会同意这不是最好的想法。

我的参考代码:

GC.Collect()

另外,在 private void Worker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bW = sender as BackgroundWorker; Req = (HttpWebRequest)WebRequest.Create(FileSource); Req.AddRange(BRead, ByteTotal); //This is why I'm using httpwebrequest using (WebResponse resp = Req.GetResponse()) using (Stream respStream = resp.GetResponseStream()) { RunDL(bW, resp, respStream, e); } } private void RunDL(BackgroundWorker bW, WebResponse resp, Stream respStream, DoWorkEventArgs e) { byte[] Buffer = new byte[ChunkSize]; CurChunkSpace = 0; while (BRead < ByteTotal) { if (bW.CancellationPending) { e.Cancel = true; break; } int temp = CurChunkSpace; if (BRead + (Buffer.Length - CurChunkSpace) > ByteTotal) { CurChunkSpace += respStream.Read(Buffer, CurChunkSpace, ByteTotal - BRead); } else { CurChunkSpace += respStream.Read(Buffer, CurChunkSpace, Buffer.Length - CurChunkSpace); } temp = CurChunkSpace - temp; BRead += temp; bW.ReportProgress(BRead); if (bW.CancellationPending) { if (KeepFile) { using (FileStream FS = new FileStream(FilePath, FileMode.Append)) { FS.Write(Buffer, 0, BRead - BWritten); BWritten = BRead; } } e.Cancel = true; break; } if (CurChunkSpace == Buffer.Length) { using (FileStream FS = new FileStream(FilePath, FileMode.Append)) { FS.Write(Buffer, 0, Buffer.Length); BWritten += Buffer.Length; CurChunkSpace = 0; } if (ChunkChangePending) { ChunkChangePending = false; Buffer = new byte[ChunkSize]; } } } if(BWritten != BRead) { using (FileStream FS = new FileStream(FilePath, FileMode.Append)) { if (TotalChunks == 1) { FS.Write(Buffer, BWritten, Buffer.Length); BWritten += Buffer.Length - BWritten; } else { FS.Write(Buffer, 0, CurChunkSpace); BWritten += CurChunkSpace; } } } Array.Clear(Buffer, 0, Buffer.Length); } 语句(FileStream)中包含using会更有效吗?

0 个答案:

没有答案