访问已处置的闭包

本文关键字:闭包 访问 | 更新日期: 2023-09-27 17:51:24

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]);
    }    
}

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


1:这也是多余的,因为MemoryStream.Close()没有被覆盖,基类只是调用Dispose(true), MemoryStream.Dispose(bool)除了将流标记为不可写之外没有做任何事情。