gpt4 book ai didi

c# - 不同的 HTTP 调用,等待相同的任务

转载 作者:行者123 更新时间:2023-12-03 20:07:30 25 4
gpt4 key购买 nike

我有一个 Task这将启动一个 win 进程,如果尚未创建文件,它将生成文件并返回它。问题是该操作被多次调用。更准确地说是它的 src <track> 的属性元素。
我有 ConcurrentDictionary<Guid, Task<string>>它跟踪进程当前正在运行的 ID

public async Task<string> GenerateVTTFile(Guid Id)
{
if (_currentGenerators.TryGetValue(id, out Task<string> task))
{
return await task; // problem is here?
}

var t = Run(); // Task
_currentGenerators.TryAdd(id, t);

return await t;
}

在 Controller 的 Action 方法中
var path = await _svc.GetSomePath();
if (string.IsNullOrEmpty(path))
{
var path = await svc.GenerateVTTFile(id);

return PhysicalFile(path, "text/vtt");
}

return PhysicalFile(path, "text/vtt");
Run()方法刚刚开始 Process并等待它。
process.WaitForExit();

我想要实现的是为同一个Id返回同一个任务的结果。看来,如果 Id字典中已经存在我 await它启动另一个进程(再次调用 Run 方法)。

有没有办法实现这一目标?

最佳答案

pointed out已经由 João Reis 提供,只需使用 GetOrAdd 方法不足以确保 Task每个键只会创建一次。来自 documentation :

If you call GetOrAdd simultaneously on different threads, valueFactory may be called multiple times, but only one key/value pair will be added to the dictionary.



处理这个问题的快速而懒惰的方法是使用 Lazy 类(class)。而不是存储 Task字典中的对象,您可以存储 Lazy<Task> wrapper 。这样,即使每个键多次创建包装器,所有无关的包装器也将被丢弃,而没有它们的 Value 请求的属性,因此不会创建重复的任务。
private ConcurrentDictionary<Guid, <Lazy<Task<string>>> _currentGenerators;

public Task<string> GenerateVTTFileAsync(Guid id)
{
return _currentGenerators.GetOrAdd(id,
_ => new Lazy<Task<string>>(() => Run(id))).Value;
}

关于c# - 不同的 HTTP 调用,等待相同的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61366140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com