c# - 如何将 Task<string> 中的数据存储到字符串?

标签 c# string azure azure-blob-storage

我需要读取容器中的 txt.gz 文件以进行测试。现在它可以正常工作了。 但我针对每个场景多次调用此方法。 是否可以将数据存储到字符串(或某物)中,而不是每次都读取数据?因为执行时间太长了。 我只想将数据作为字符串读取并存储一次。然后我可以多次使用这个字符串。可能吗?

    public async Task<string> GetTheBlobData(string blobName)
    {
        BlobContainerClient container = new BlobContainerClient(connectionString,containerName);

        var blockBlob = container.GetBlobClient($"{blobName}");

        // Get the blob file as text
        using (var gzStream = await blockBlob.OpenReadAsync())
        {
            using (GZipStream decompressionStream = new GZipStream(gzStream, CompressionMode.Decompress))
            {
                using (StreamReader reader = new StreamReader(decompressionStream, Encoding.UTF8))
                {
                  return reader.ReadToEnd();
                }
            }
        }
    }

最佳答案

如果您想要的是内存(意思是:缓存值并返回已知输入的预先存在的值),那么您可以尝试使用并发字典之类的方法来重新对每个进行中的操作使用现有的任务( Task[<T>] 可以等待任意多次,并且相对于线程来说是稳健的,但重要的是:不要使用 ValueTask[<T>] 执行此操作,它只能是等待一次):

class MyType
{
    private readonly ConcurrentDictionary<string, Task<string>> _memoized
        = new ConcurrentDictionary<string, Task<string>>();
    public Task<string> GetTheBlobData(string blobName)
        => _memoized.GetOrAdd(blobName,
        static (blob, obj) => obj.GetTheBlobDataImpl(blob), this);
    private async Task<string> GetTheBlobDataImpl(string blobName)
    {
        // your existing code...
    }
}

但是请注意,这会记住失败和成功。

(如果您不使用 C# 9,只需删除 static 关键字;我使用它来确保我们没有任何捕获范围分配问题)

关于c# - 如何将 Task<string> 中的数据存储到字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65806624/

相关文章:

c# - 如何将文件截断到一定大小但保留结尾部分?

javascript - Websocket 帧大小限制

azure - 如何使用 yaml 文件中的标签 - terraform

Azure FTP 到实时网页

c# - 从 C# 访问注册表中的 Windows 服务参数

c# - 动态改变字体asp.net页面

c# - 如何遍历对象的嵌套属性

Android:android.content.res.Resources$NotFoundException:字符串资源 ID #0x5

string - 字符串数组中出现频率最高的元素,MATLAB

azure - 将暂存和生产配置与 Windows Azure 网站结合使用