我正在用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();
}
}
能正常工作的小文件,但流写入内存泄漏,最终崩溃。有什么我在这里失踪?
.net中存在内存限制。对于32位系统,我认为它有点像2GB。如果您的文件超出此内存限制,则会引发OutOfMemory异常。您可以尝试将文件拆分为更小的块并再次合并它们。 – daryal 2012-04-18 13:47:35
一些注意事项:1)如果你使用.NET 4,你应该考虑使用['Stream.CopyTo'](http://msdn.microsoft.com/en-us/library/dd782932.aspx),而不是滚动你自己的版本。 2)我很确定当''using'语句处理'reader'时,''''将被关闭,所以你不必这样做。 – 2012-04-18 13:57:44
我使用这个的原因是我想从后台工作人员向gui报告进度。这样做,而不是在例子中的调试。 – kohni 2012-04-18 14:05:03