我有一个名为 Load 的用户界面按钮,它会生成一个线程,该线程进而生成一个任务。任务中有一个等待操作,如果超时,则任务被取消。Load 按钮不会被禁用,用户可以多次点击它。每次点击时,上一个任务都应该被取消。
我对如何在此处使用 CancellationTokenSource 和 CancellationToken 感到困惑。以下是代码。您能否建议如何使用,并且下面的用法是否有问题?请勿使用 Async,因为我们还没有到那里。
我对如何在此处使用 CancellationTokenSource 和 CancellationToken 感到困惑。以下是代码。您能否建议如何使用,并且下面的用法是否有问题?请勿使用 Async,因为我们还没有到那里。
CancellationTokenSource _source = new CancellationTokenSource();
public void OnLoad()
{
//Does this cancel the previously spawned task?
_source.Cancel();
_source.Dispose();
_source = new CancellationTokenSource();
var activeToken = _source.Token;
//Do I need to do the above all the time or is there an efficient way?
Task.Factory.StartNew(() =>
{
var child = Task.Factory.StartNew(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(20));
activeToken.ThrowIfCancellationRequested();
}, activeToken);
if (!child.Wait(TimeSpan.FromSeconds(5)))
{
_source.Cancel();
}
});
}
注意:我需要取消任何先前生成的任务,并且每个生成的任务都应该有一个超时时间。
Task
是做什么的?你能在其中定期检查CancellationToken
吗? - svick