【发布时间】:2013-12-17 16:04:24
【问题描述】:
我有一个名为“加载”的 UI 按钮。它产生一个线程,而线程又产生一个任务。任务有一个等待,如果它过期,任务将被取消。加载按钮未被禁用,用户可以多次单击它。每次单击时,应取消上一个任务。
我对如何在此处使用 CancellationTokenSource 和 CancellationToken 感到困惑。下面是代码。您能否建议如何使用它以及以下用法是否有任何问题?请不要异步,因为我们还没有。
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();
}
});
}
注意我需要取消任何以前生成的任务,并且每个生成的任务都应该有一个超时。
【问题讨论】:
-
我认为有一种内置方法可以在一定超时后取消令牌。
-
@SLaks-因为我在 .NET 4.0 上这行不通
-
我知道你说没有异步,只是一个参考,你可以使用微软的this nuget package 在 4.0 中使用异步(如果你使用的是 VS 2012 或更高版本)。
-
Task有什么作用?你能定期检查一下里面的CancellationToken吗?
标签: c# c#-4.0 task-parallel-library