【问题标题】:Manage memoryStream when donwload files from Azure Blob从 Azure Blob 下载文件时管理 memoryStream
【发布时间】:2020-02-04 22:56:39
【问题描述】:

我正在为从 Azure Blob 存储下载文件创建包装器。 我有一个简单的文件模型

public class File
{
    public Stream Data { get; set; }
    public string Name { get; set; }
    public string Path { get; set; }
    public long Size { get; set; }
}

我下载文件的方法如下所示

private async Task<File> GetFile(string name, string path = null)
{
    var blockBlob = _container.GetBlockBlobReference(GetKey(name, path));
    await blockBlob.FetchAttributesAsync();

    var memoryStream = new MemoryStream();
    await blockBlob.DownloadToStreamAsync(memoryStream).ConfigureAwait(false);
    memoryStream.Position = 0;

    return new File(
        name: name,
        path: path: blockBlob.Uri.ToString(),
        data: memoryStream,
        size: blockBlob.Properties.Length);
}

问题:我可以创建一个 memoryStream 并且从不丢弃它吗?我应该将 memoryStream 作为参数传递并将生命周期的责任转移给调用者吗?如果是,我怎么能用 mu 模型做到这一点?

【问题讨论】:

  • 不建议让调用者负责管理流(实际上在您的实现中,您应该将 memorystream 的使用包装在 using 语句中) - 为什么不将 data 属性设置为 block /文本而不是流(取决于您实际存储的内容)?
  • 什么意思?如果它应该在调用方使用,我如何包装 memorystream 以使用,否则它将在 GetFile 方法中处理。
  • 内存流是在非静态方法中创建的,因此它在执行堆栈上创建,并在您退出方法时自动释放。堆栈被弹出,因此所有数据都被销毁。
  • 你的意思是设计一切都很好?
  • @jdweng 你是对的 - 不需要使用 MemoryStream(请参阅docs.microsoft.com/en-us/dotnet/api/… 中的注释)。所以我猜代码是可以的

标签: c# asp.net-web-api azure-blob-storage


【解决方案1】:

MemoryStream 不需要根据文档进行显式处理(请参阅docs.microsoft.com/en-us/dotnet/api/… 中的注释),因此您当前的设计很好。

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2021-01-04
    • 1970-01-01
    • 2021-12-08
    • 2018-09-27
    • 2013-02-06
    相关资源
    最近更新 更多