我有一个长时间运行、长间隔轮询的进程。我需要能够强制更新并重新开始轮询。
最明显的想法是取消轮询任务,并启动一个新任务,因为初始循环总是会更新。
我正在尝试找出最好的方法来做到这一点,使用OperationCanceledException来控制程序流似乎很奇怪——但也许这是正确的选择?以下是我目前的代码:
public void Start()
{
var previousDateTime = DateTime.MinValue;
CancellationTokenSource = new CancellationTokenSource();
CancellationToken = CancellationTokenSource.Token;
ASMTask = Task.Run(async () =>
{
try
{
while (!CancellationToken.IsCancellationRequested)
{
if (CheckForUpdate())
{
Update(previousDateTime);
}
await Task.Delay(PollingInterval * 1000, CancellationToken);
}
CancellationToken.ThrowIfCancellationRequested();
}
catch (OperationCanceledException oc)
{
Start();
}
}, CancellationToken);
}
public void ForceUpdate()
{
CancellationTokenSource.Cancel();
}
我不确定在任务内调用Start()方法会对资源产生什么影响?我猜测这是可以接受的,因为新任务将被分配一个线程来执行?
我想做这样的事情:
public void ForceUpdate()
{
CancellationTokenSource.Cancel();
ASMTask.WaitForCancellationComplete();
Start();
}
但是我看不到等待任务完成的取消方式。
编辑:重复问题。
上一个问题的被接受答案使用了与我试图避免的相同的异常处理方法,然而第二个答案确实很有用,但在阅读Matthew Watson提供的解释之前我没有意识到这一点。 我很高兴将其作为重复问题关闭,尽管我无法弄清如何实际执行!