我需要读取容器中的 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/