【发布时间】:2019-05-29 10:58:30
【问题描述】:
我的代码正在启动一个带有心跳的长时间运行的后台任务。该应用程序正在更新以使用 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 - 根据需要通过方法签名添加异步/等待
让这段代码在后台线程上运行并允许异步/等待模式的正确方法是什么?
【问题讨论】:
标签: c# async-await