Удалить результат выполнения Task если ответ уже получен всеми кому нужно
Задание: если задача выполняется уже другим запросом, дождаться ответа и вернуть его. Если же в данный момент никто ничего не читает, выполнить самому и получить свой результат.
Т.е. по факту, мы не можем просто оставить результат уже когда-то полученный на будущее, а необходимо в конце как-то отследить, что все получат ответ, а уже после удалить результат задачи.
Пытался сделать так:
У меня есть Singleton-сервис и async метод внутри, в который поступают запросы из контроллера. Метод выполняет некоторые действия в процессе чего ссылается на:
private ConcurrentDictionary<string, Task<string>> ArrayTasks = new ConcurrentDictionary<string, Task<string>>();
с помощью
var task = ArrayTasks.GetOrAdd(taskName, taskName => Task.Run(async () =>
{
return await GetPointName();
});
После чего я пишу
return await task;
и в finally
ArrayTasks.Remove(taskName, out var value);
В Task.Run добавлял дополнительно await Task.Delay(10000) чтоб можно было несколько запросов создать и проверить. В результате тестов, либо 1 проскакивает и возвращает лишь себе результат, либо 2 максимум. Остальные по новой считают таску хоть и дождались выполнения.
Что можно сделать в данной ситуации? Может, я вообще неверный подход выбрал?
Думал в сторону ивентов, но без понятия как опять отследить момент в который можно удалять задачу.