如何停止列表中的任务再次实现。任务列表如何停止任务C#
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());
}
如何停止列表中的任务再次实现。任务列表如何停止任务C#
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());
}
该任务无法取消自己。从你显示的代码看起来你有一个任务列表。然后,如果您在执行你的代码希望能够取消任务,你必须创建一个CancellationTokenSource
并传递CancellationToken
到任务的构造函数:
list1.Add(new Task<string>((x) => { return x.ToString(); }, cancelationTokenSource.Token));
(在上面的代码我假定任务有望返回一个字符串,但它会为任何任务工作)
然后,如果你需要取消您使用cancelationTokenSource
任务:
cancelationTokenSource.Cancel();
这将终止任务。然后你可以做的任务本身是检查它是否已被取消:
list1.ForEach(t =>
{
if (t.IsCanceled)
{
}
}
希望有所帮助。我的回答是基于我对你的代码的解释,因为问题没有太多解释。如果您需要更多细节,请澄清。
我可以添加像这样的任务吗? 'List
实际上,'cancelationTokenSource.Cancel'不会以'Thread.Abort'的方式取消任务 - 相反它会告诉任务在_和__时停止,并且如果任务询问其CancellationToken是否应该停止下次。此外,任务已经知道它的'CancellationToken',它传递到'Task.Run'只是让其地位变得'Canceled',而不是'Failed'如果令牌抛出一个'TaskCanceledException' ... – Haukinger
没有必要注销在这种情况下,由于对WaitAll()的调用,所有任务都已完成; –
夫妇的事情第一:
不要使用任务建构。 使用 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());
基本上使得它运行启动任务,然后开始下一个循环之前等待它的内部。
我建议使用Parallel.ForAll()的时候,你需要几个CPU绑定操作的循环来完成。如果是IO绑定使用异步/等待
然后,您尝试做的是取消任务,你已经等待它们完成后。这是没有道理的,或者我不明白你想要完成什么。
现在,让我们谈谈取消工作。你需要像这样的东西:
var cts = new CancellationTokenSource();
var ct = cts.Token;
提供CancellationToken ct到list1中的任务。然后调用cts.Cancel()来取消给定令牌的任务。 例如Task.Run(asyncWork, ct)
其中asyncWork是您要执行的操作。
在操作asyncWork,检查使用ct.ThrowIfCancellationRequested();
您需要提供更多关于你把列表1中为更好的建议的任务。
请解释一点。我无法理解你的问题。 – NineBerry
我需要认识到这个循环中,但一个执行后,我得到错误“错误‘System.Threading.Tasks.Task’不包含‘IsCancellationRequested’的定义,并没有扩展方法‘IsCancellationRequested’接受的第一个参数可以找到类型'System.Threading.Tasks.Task'(你是否缺少使用指令或程序集引用?)“ – Quicki