【发布时间】:2023-03-23 14:45:01
【问题描述】:
我有一个需要定期运行的任务。我的第一个实现是这样的:
public static void CheckTask(CancellationTokenSource tokenSource)
{
do
{
// Do some processing
Console.WriteLine("Processing");
// Sleep awhile and wait for cancellation
// If not cancelled, repeat
} while (!tokenSource.Token.WaitHandle.WaitOne(1500));
Console.WriteLine("Bye bye");
}
这个任务是这样开始的:
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task task = null;
task = new Task((x)=> {
CheckTask(tokenSource);
//CheckTask2(t, (object)tokenSource);
}, tokenSource.Token);
task.Start();
然后我想,与其在任务中循环,不如使用 ContinueWith 重新安排它?我的下一个实现是这样的:
public static void CheckTask2(Task task, object objParam)
{
CancellationTokenSource tokenSource = (CancellationTokenSource)objParam;
// Do some processing
Console.WriteLine("Processing");
// Sleep awhile and wait for cancellation
if(tokenSource.Token.WaitHandle.WaitOne(1500))
{
Console.WriteLine("Cancel requested");
return;
}
// Reschedule
task.ContinueWith(CheckTask2, tokenSource);
}
第二个实现更容易读写,我的测试显示没有区别,但我仍然想知道 ContinueWith 本身的任务是否有缺点?
【问题讨论】:
-
我觉得这个问题更适合programmers.stackexchange.com。话虽如此,这似乎是公认的模式(见this question on msdn);另请参阅this question and answers 以了解使用 await 和 async 的取消模式,这可能相关也可能不相关:p
-
创建一个任务(
ContinueWith正在做的)有相关的启动成本,但这些应该可以忽略不计。如果它适合您并使代码更清晰:请继续。
标签: c# .net task-parallel-library async-await