У меня есть код, который начинает работу над длительной фоновой задачей с биением.Приложение обновляется для использования async / await, и у меня возникают проблемы с обновлением этого кода в соответствии с комплектом.Вот код примерно:
private void StartBackgroundTasks(CancellationTokenSource cancelTokenSrc)
{
void TaskAction()
{
DoWork();
}
void HeartbeatAction()
{
var task = TaskFactory.CreateAndStartLongRunningTask(
TaskAction, cancelTokenSrc.Token);
while (true)
{
// checks Task.Status to figure out when to stop
if (!TryPerformHeartbeat(task)) break;
Task.Delay(TimeSpan.FromSeconds(20)).Wait();
}
}
TaskFactory.CreateAndStartLongRunningTask(HeartbeatAction);
}
А вот как запускаются долгосрочные задачи:
internal static class TaskFactory
{
internal static Task CreateAndStartLongRunningTask(
Action action, CancellationToken? token = null)
{
return Task.Factory.StartNew(
action,
token ?? CancellationToken.None,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
}
Из того, что я понимаю, мне нужно:
- передать
Func<Task>
на CreateAndStartLongRunningTask
- изменить
StartNew
на async () => await taskFunc()
вместо action
- добавить асинхронное / ожидает через сигнатуры метода какНужен
Каким будет правильный способ заставить этот код работать в фоновом потоке и использовать шаблон асинхронного / ожидающего выполнения?