Мне нужно опубликовать некоторые данные в службе из веб-приложения C #. Сами данные собираются, когда пользователь использует приложение (своего рода статистика использования). Я не хочу отправлять данные в службу во время каждого запроса пользователя, я бы предпочел собирать данные в приложении и отправлять затем все данные в одном запросе в отдельном потоке, который не обслуживает запросы пользователей (я имею в виду пользователю не нужно ждать обработки запроса сервисом). Для этого мне нужен своего рода setInterval
аналог JS - запуск функции каждые X секунд для сброса всех собранных данных в сервис.
Я обнаружил, что _2 _ предоставляет нечто похожее ( Elapsed
). Однако это позволяет запустить метод только один раз, но это не большая проблема. Основная сложность в том, что требуется подпись
void MethodName(object e, ElapsedEventArgs args)
а я хотел бы запустить асинхронный метод, который будет вызывать веб-службу (входные параметры не важны):
async Task MethodName(object e, ElapsedEventArgs args)
Может кто-нибудь посоветует, как решить описанную задачу? Любые советы приветствуются.
result
в вашем случае будет содержать только задачу, следующая строка после этого произойдет немедленно.await
будет блокироваться асинхронно до тех пор, пока периодическая задача не будет отменена. 11.10.2016await FooAsync
будет иметь ненулевое время выполнения. Например, еслиFooAsync
занимает 500 мс и запускается каждый час, то вы отключитесь на 10 минут менее чем за 2 месяца. 06.11.2017Task.Delay
перед ожиданиемFooAsync
и ожидая его после. Это будет иметь значение, еслиFooAsync
синхронно выполнит некоторую нетривиальную работу перед возвратомTask
. 30.06.2020FooAsync
по какой-то причине займет больше интервала задержки ... 01.07.2020FooAsync
занимает больше времени, чемinterval
, то с моим предложением период будет продлен и, по существу, будет определяться продолжительностьюFooAsync
. В этом случае более точное имя для аргументаinterval
будетminInterval
. Между прочим, текущая версияPeriodicFooAsync
не периодическая. Он не пытается поддерживать постоянный период между каждым вызовомFooAsync
. Вместо этого он просто накладывает задержку между завершением одной операции и началом следующей. 02.07.2020while (true)
) цикл, что почти всегда является плохой идеей. Если вам нужна точная частота вращения педалей, решение должно быть более надежным. 02.07.2020