Удалить результат выполнения 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 максимум. Остальные по новой считают таску хоть и дождались выполнения.

Что можно сделать в данной ситуации? Может, я вообще неверный подход выбрал?

Думал в сторону ивентов, но без понятия как опять отследить момент в который можно удалять задачу.


Ответы (0 шт):