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



我收到异常警告,访问内部using块上的已处置对象。
是否需要memoryStream.close()语句或它是否多余?


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

最佳答案

您得到的警告是因为编译器不够聪明,以至于您在using中使用MemoryStream时,您永远不会不在内存流的ContinueWith块之外。

您通常不将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]);
    }
}


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



 1:这也是冗余的,因为不重写MemoryStream.Close(),并且base class just calls Dispose(true)MemoryStream.Dispose(bool)除了将流标记为不可写以外,不执行任何其他操作。

关于c# - 进入已处置的封闭装置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30586595/

10-13 08:12