【发布时间】:2017-03-02 14:51:59
【问题描述】:
我有一个长时间运行、长时间间隔的轮询过程。我需要能够强制更新并重新启动轮询。
想到的最明显的事情是取消轮询任务,并开始一个新的,因为初始循环总是更新。
我试图找出最好的方法来做到这一点,使用 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();
}
但我看不到通过取消来等待任务完成的方法。
编辑:RE - 重复问题。
上一个问题的公认答案是以我试图避免的相同方式使用异常,但事实证明第二个答案很有用,但直到阅读@提供的解释后我才意识到这一点987654321@。 我很高兴将其作为副本关闭,尽管我不知道如何实际做到这一点!
【问题讨论】:
标签: c# multithreading task cancellation-token