在任务中使用语句

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)

svi*_*ick 5

  1. MemoryStream是实现的类之一IDisposable,因为它们的基类可以实现.MemoryStream没有任何资源(除了托管内存),因此处理它实际上是不必要的.
  2. HttpResponseMessage是一次性的.这意味着当它发送的整个响应时,该对象被处理掉.这样做可以处理包含的内容HttpContent,在StreamContent处理底层的情况下Stream.因此,即使你有一个Stream应该被处置的,你也不必担心这种情况.