Dun*_*ken 6 c# using task-parallel-library asp.net-web-api
在ASP.NET Web API控制器中,我想返回一个图像.为了流式传输图像,我需要一个MemoryStream.通常我会把它包装在一个using声明中,以确保它之后得到妥善处理.但是,因为这在异步中执行Task不起作用:
public class ImagesController : ApiController
{
private HttpContent GetPngBitmap(Stream stream)
{
var pngBitmapEncoder = new PngBitmapEncoder();
pngBitmapEncoder.Save(stream);
stream.Seek(0, SeekOrigin.Begin);
return new StreamContent(stream);
}
// GET api/images
public Task<HttpResponseMessage> Get(string id, string path)
{
//do stuff
return Task.Factory.StartNew(() =>
{
var stream = new MemoryStream(); //as it's asynchronous we can't use a using statement here!
{
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = GetPngBitmap(stream)
};
response.Content.Headers.ContentType =
new System.Net.Http.Headers.MediaTypeHeaderValue("image/png");
return response;
}
//how can I dispose stream???
});
}
}
Run Code Online (Sandbox Code Playgroud)
MemoryStream是实现的类之一IDisposable,因为它们的基类可以实现.MemoryStream没有任何资源(除了托管内存),因此处理它实际上是不必要的.HttpResponseMessage是一次性的.这意味着当它发送的整个响应时,该对象被处理掉.这样做可以处理包含的内容HttpContent,在StreamContent处理底层的情况下Stream.因此,即使你有一个Stream应该被处置的,你也不必担心这种情况.| 归档时间: |
|
| 查看次数: |
1731 次 |
| 最近记录: |