返回流C#时如何覆盖流关闭

Posted

技术标签:

【中文标题】返回流C#时如何覆盖流关闭【英文标题】:How to override stream closing when returning stream C# 【发布时间】:2022-01-14 16:50:06 【问题描述】:

我希望能够从我的函数中返回 MemoryStream,但我认为在返回 stream 时它也会自动关闭

using (var httpStream = await httpClient.GetStreamAsync(link)) 

    using (var stream = new MemoryStream()) 
    
        await httpStream.CopyToAsync(stream); 
        return stream;    
    

有什么办法可以让override 这个我可以返回stream 以便我可以在其他地方使用它。

这是我尝试在另一种方法中使用它的方式:

using (var fielStream = new FileStream(path, FileMode.Create))

    Stream stream = await GetStreamAsync(videoid, type, quality);

    await stream.CopyToAsync(fileStream);  

【问题讨论】:

我建议您仔细阅读 SO Tour 部分,因为它展示了 SO 的工作原理。我如何问一个好问题?可能会有所帮助。此外,您可能会发现 SO Asking 部分很有用。 ***.com/tour 删除using:应该是调用者Dispose 请勿发布代码图片 【参考方案1】:

删除内部using:它是调用者(调用创建者)应该Dispose 流:

using (var httpStream = await httpClient.GetStreamAsync(link)) 
  var stream = new MemoryStream();

  try 
    await httpStream.CopyToAsync(stream); 

    return stream;    
  
  catch 
    stream.Dispose();

    throw;
   

调用者应该输入using,像这样:

// We create MemoryStream with the code above (GetStreamAsync) 
/ and then Dispose the stream 
using (var stream = await GetStreamAsync(...)) 
  ...

【讨论】:

以上是关于返回流C#时如何覆盖流关闭的主要内容,如果未能解决你的问题,请参考以下文章

iOS (APN) - 身份验证失败,因为远程方已关闭 C# 中的传输流

C# 身份验证失败,因为远程方已关闭传输流

发生异常时如何正确关闭资源流

如何关闭服务器的grpc流

我们如何读取或使用输出流的内容 [关闭]

普通用户的“身份验证失败,因为远程方已关闭传输流”