【问题标题】:OutOfMemoryException with RestSharp file upload带有 RestSharp 文件上传的 OutOfMemoryException
【发布时间】:2012-04-20 02:03:05
【问题描述】:

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

...
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();
    }

}

这适用于小文件,但 Stream 写入会泄漏内存,最终崩溃。有什么我在这里想念的吗?

【问题讨论】:

  • .net 中有内存限制。对于 32 位系统,我认为它类似于 2gb。如果您的文件超过此内存限制,则会引发 OutOfMemory 异常。您可以尝试将文件拆分为更小的块并再次合并它们。
  • 附注:1) 如果您使用.NET 4,您应该考虑使用Stream.CopyTo 而不是滚动您自己的版本。 2) 我很确定reader 将在您的using 语句处理时为您关闭,因此您不必明确地这样做。
  • 我使用它的原因是我想从后台工作人员向 gui 报告进度。已完成,而不是示例中的调试。

标签: c# restsharp


【解决方案1】:

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

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();
        }

    }

【讨论】:

  • 感谢您的回答。冲洗溪流没有帮助。已经尝试过了...正如我所说,只要文件大小
【解决方案2】:

在挖掘 RestSharp 资源后自己解决了这个问题。 http://support.microsoft.com/kb/908573

【讨论】:

  • 您能说明一下您是如何解决这个问题的吗?我遇到了同样的问题,即调用 RestClient Execute 函数后上传线程消失了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2014-06-06
相关资源
最近更新 更多