2012-04-18 100 views
0

我正在用RestSharp实现一个简单的文件上传桌面工具。当我使用自定义流式编写器将大文件添加到请求时(为了更新gui的上传进度),stream.Write会引发OutOfMemoryException。简化的代码示例:OutOfMemoryException和RestSharp文件上传

... 
var request = new RestRequest { Resource = "/test" }; 
request.Method = Method.POST; 
request.AddFile("file", writer, "largefile.iso"); 

var response = client.Execute(request); 
... 

private void writer(Stream stream) 
{ 
    using (FileStream reader = File.OpenRead("d:\\download\\largefile.iso")) 
    { 
     byte[] buffer = new byte[16384]; //16k buffer 
     int bytesRead = 0; 
     int read = 0; 

     while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
     { 
     stream.Write(buffer, 0, read); 
     bytesRead += read; 
     System.Diagnostics.Debug.WriteLine("uploading: " + (int) ((double)bytesRead/reader.Length * 100) + "%"); 
     } 
     reader.Close(); 
    } 

} 

能正常工作的小文件,但流写入内存泄漏,最终崩溃。有什么我在这里失踪?

+0

.net中存在内存限制。对于32位系统,我认为它有点像2GB。如果您的文件超出此内存限制,则会引发OutOfMemory异常。您可以尝试将文件拆分为更小的块并再次合并它们。 – daryal 2012-04-18 13:47:35

+0

一些注意事项:1)如果你使用.NET 4,你应该考虑使用['Stream.CopyTo'](http://msdn.microsoft.com/en-us/library/dd782932.aspx),而不是滚动你自己的版本。 2)我很确定当''using'语句处理'reader'时,''''将被关闭,所以你不必这样做。 – 2012-04-18 13:57:44

+0

我使用这个的原因是我想从后台工作人员向gui报告进度。这样做,而不是在例子中的调试。 – kohni 2012-04-18 14:05:03

回答

0

也许你应该尝试每次写入后刷新流缓冲区:

private void writer(Stream stream) 
    { 
     using (FileStream reader = File.OpenRead("d:\\download\\largefile.iso")) 
     { 
      byte[] buffer = new byte[16384]; //16k buffer 
      int bytesRead = 0; 
      int read = 0; 

      while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       stream.Write(buffer, 0, read); 
       stream.Flush(); 
       bytesRead += read; 
       System.Diagnostics.Debug.WriteLine("uploading: " + (int)((double)bytesRead/reader.Length * 100) + "%"); 
      } 
      reader.Close(); 
     } 

    } 
+0

感谢您的回答。冲洗溪流并没有帮助。试过已经...正如我所说的,只要filesize kohni 2012-04-18 13:58:12