如何停止列表中的任务再次实现。
for (f = 0; f < 3; f++)
{
list1.ForEach(t => t.Start());
list1.ForEach(t => t.Wait());
Task.WaitAll(list1.ToArray());
//here is problem
list1.ForEach(t => t.Cancel());
}
答案 0 :(得分:1)
任务无法取消。从您显示的代码看起来您有一个任务列表。如果您希望在执行代码时能够取消任务,则必须创建CancellationTokenSource
并将CancellationToken
传递给任务的构造函数:
list1.Add(new Task<string>((x) => { return x.ToString(); }, cancelationTokenSource.Token));
(在上面的代码中,我假设任务应该返回一个字符串,但它可以用于任何任务。)
然后,如果您需要取消任务,请使用cancelationTokenSource
:
cancelationTokenSource.Cancel();
这将终止任务。然后你可以对任务本身做的是检查它是否已被取消:
list1.ForEach(t =>
{
if (t.IsCanceled)
{
}
}
希望有所帮助。我的答案是基于我对你的代码的解释,因为问题没有解释太多。如果您需要更多细节请澄清。
答案 1 :(得分:0)
首先要做的事情是:
不要使用任务构造函数。 使用 Task.Run()请参阅http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx
但在你的情况下,我甚至不确定你是否应该使用任务。对于循环,有PLINQ。
循环中的这段代码
list1.ForEach(t => t.Start());
list1.ForEach(t => t.Wait());
基本上使它运行启动任务,然后在开始下一个循环之前等待它。
当你需要在循环中完成几个CPU绑定操作时,我建议使用Parallel.ForAll()。如果是IO绑定,请使用async / await
然后,您尝试执行的操作是在等待完成任务后取消任务。这没有任何意义,或者我不太了解你想要完成的事情。
现在,让我们谈谈取消工作。你需要这样的东西:
var cts = new CancellationTokenSource();
var ct = cts.Token;
将CancellationToken ct提供给list1中的任务。然后调用cts.Cancel()取消给定令牌的任务。
例如Task.Run(asyncWork, ct)
其中asyncWork是您要执行的操作。
在操作asyncWork中,使用ct.ThrowIfCancellationRequested();
您需要提供有关列入list1的任务的更多信息,以获得更好的建议。