如何解决如何将数据从 Task<string> 存储到字符串?
我需要读取容器中的 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
关键字;我使用它来确保我们没有任何捕获范围分配问题)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。