获得处置关闭

时间:2015-06-02 02:56:45

标签: c# async-await task-parallel-library

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()语句或者它是多余的?
  3. 请建议如何改进这段代码。

1 个答案:

答案 0 :(得分:10)

您收到的警告是因为当您使用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 ,因为处理它也会关闭流。

1:它也是多余的,因为MemoryStream.Close()没有被覆盖,base class just calls Dispose(true)MemoryStream.Dispose(bool)除了将流标记为不可写之外什么都不做。