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/