繁体   English   中英

获得处置关闭

[英]Access to disposed closure

using (var memoryStream = new MemoryStream())
{
    await
        response
            .Content
            .CopyToAsync(memoryStream)
            .ContinueWith(
                copyTask =>
                {
                    using (var import = new Import())
                    {
                        var data = memoryStream.ToArray();
                        import.SaveDocumentByRecordNum(data, fileName, items[0]);
                        memoryStream.Close();
                    }
                });
}
  1. 我收到异常警告访问内部使用块上的已处置对象。
  2. memoryStream.close()语句是必需的还是冗余的?

请建议如何改进这段代码。

你得到的警告是因为当你在ContinueWith使用MemoryStream时,编译器不够聪明,不知道你永远不会在内存流的using块之外。

你通常不混合async / await和ContinueWith ,切换到只使用async / await本身也会修复你的警告。 以下代码将与您的旧代码一样,但不会导致警告。

using (var memoryStream = new MemoryStream())
{
    await response.Content.CopyToAsync(memoryStream).ConfigureAwait(false);

    using (var import = new Import())
    {
        var data = memoryStream.ToArray();
        trimImport.SaveDocumentByRecordNum(data, fileName, items[0]);
    }    
}

当它在using语句中时,对任何基于Stream的对象调用Close()也是冗余1 ,因为处理它也将关闭流。


1:它也是多余的,因为没有重写MemoryStream.Close()并且基类只调用Dispose(true)MemoryStream.Dispose(bool)除了将流标记为不可写之外不会执行任何操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM