gpt4 book ai didi

c# - 当作为 ActionResult 返回时,MemoryStream 是否会自动处理掉?

转载 作者:可可西里 更新时间:2023-11-01 08:37:20 28 4
gpt4 key购买 nike

public ActionResult CustomChart(int reportID)
{
Chart chart = new Chart();

// Save the chart to a MemoryStream
var imgStream = new MemoryStream();
chart.SaveImage(imgStream);
imgStream.Seek(0, SeekOrigin.Begin);

// Return the contents of the Stream to the client
return File(imgStream, "image/png");
}

我习惯于将“using”语句与 MemoryStreams 结合使用。这是不需要“使用”语句的情况吗?或者在“using”语句中调用 return 是否有效?

编辑:

出于我的目的,我发现引入“using”语句不起作用(抛出 ObjectDisposedException)。这是我在客户端使用它所做的:

$('#ReportTest').bind('load', function () {
$('#LoadingPanel').hide();
$(this).unbind('load');
}).bind('error', function () {
$('#LoadingPanel').hide();
$(this).unbind('error');
}).attr('src', '../../Chart/CustomChart?ReportID=' + settings.id);

最佳答案

Does a MemoryStream get disposed of automatically when returning it as an ActionResult?

是的,MVC(至少版本 3)会为您清理它。你可以拍一个look at the source FileStreamResult 中的WriteFile 方法:

protected override void WriteFile(HttpResponseBase response) {
// grab chunks of data and write to the output stream
Stream outputStream = response.OutputStream;
using (FileStream) {
byte[] buffer = new byte[_bufferSize];

while (true) {
int bytesRead = FileStream.Read(buffer, 0, _bufferSize);
if (bytesRead == 0) {
// no more data
break;
}

outputStream.Write(buffer, 0, bytesRead);
}
}
}

using (FileStream) { 行会将 Stream 放在一个 using block 中,因此在将内容写入 Http Response 时将其释放。

您还可以通过创建执行此操作的虚拟流来验证此行为:

public class DummyStream : MemoryStream
{
protected override void Dispose(bool disposing)
{
Trace.WriteLine("Do I get disposed?");
base.Dispose(disposing);
}
}

因此 MVC 处理它。

关于c# - 当作为 ActionResult 返回时,MemoryStream 是否会自动处理掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8807965/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com