Цель async
- не поддерживать первичные потоки.Но это уже фоновый поток, так что это не имеет большого значения - если только это не приложение ASP.NET Core.Это единственный раз, когда это имеет значение, поскольку существует ограниченный пул потоков, и его исчерпание означает, что больше нельзя обслуживать запросы.
Если вы действительно хотите запустить его async
, просто сделайте его async
:
private async void ExecuteTask(object state)
{
//await stuff here
}
Да, я знаю, что вы говорите, что не хотите «стрелять и забывать», но события на самом деле просто так: они огонь и забывают.Таким образом, будет вызван ваш метод ExecuteTask
, и ничто не будет заботиться (или проверять), если он (1) все еще работает или (2), если он потерпел неудачу. Это верно, независимо от того, запускаете ли вы этот async
или нет.
Вы можете уменьшить количество ошибок, просто обернув все свои методы ExecuteTask
в блок try
/ catch
и сделавубедитесь, что он где-то зарегистрирован, чтобы вы знали, что произошло.
Другая проблема заключается в том, что он все еще работает (что, опять же, проблема, даже если вы не запускаете async
).Существует также способ смягчить это:
private Task doWorkTask;
private void ExecuteTask(object state)
{
doWorkTask = DoWork();
}
private async Task DoWork()
{
//await stuff here
}
В этом случае ваш таймер просто запускает задачу.Но разница в том, что вы держите ссылку на Task
.Это позволит вам проверить состояние Task
в любом другом месте вашего кода.Например, если вы хотите проверить, выполнено ли это, вы можете посмотреть doWorkTask.IsCompleted
или doWorkTask.Status
.
Кроме того, когда ваше приложение закрывается, вы можете использовать:
await doWorkTask;
чтобы убедиться, что задание выполнено до закрытия приложения.В противном случае поток будет просто уничтожен, возможно, оставит вещи в несогласованном состоянии.Просто имейте в виду, что использование await doWorkTask
вызовет исключение, если необработанное исключение произошло в DoWork()
.
Также, возможно, хорошей идеей будет проверить, завершено ли предыдущее задание, прежде чем запускать следующее.