2016-05-14 64 views
-1

如何停止列表中的任务再次实现。任务列表如何停止任务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()); 
} 
+0

请解释一点。我无法理解你的问题。 – NineBerry

+0

我需要认识到这个循环中,但一个执行后,我得到错误“错误‘System.Threading.Tasks.Task’不包含‘IsCancellationRequested’的定义,并没有扩展方法‘IsCancellationRequested’接受的第一个参数可以找到类型'System.Threading.Tasks.Task'(你是否缺少使用指令或程序集引用?)“ – Quicki

回答

1

该任务无法取消自己。从你显示的代码看起来你有一个任务列表。然后,如果您在执行你的代码希望能够取消任务,你必须创建一个CancellationTokenSource并传递CancellationToken到任务的构造函数:

list1.Add(new Task<string>((x) => { return x.ToString(); }, cancelationTokenSource.Token)); 

(在上面的代码我假定任务有望返回一个字符串,但它会为任何任务工作)

然后,如果你需要取消您使用cancelationTokenSource任务:

cancelationTokenSource.Cancel(); 

这将终止任务。然后你可以做的任务本身是检查它是否已被取消:

list1.ForEach(t => 
{ 
    if (t.IsCanceled) 
    { 

    } 
} 

希望有所帮助。我的回答是基于我对你的代码的解释,因为问题没有太多解释。如果您需要更多细节,请澄清。

+0

我可以添加像这样的任务吗? 'List list1 = new List ();对于(int i = 0; i <5; i ++) { list1.Add(new Task(actionA)); }' – Quicki

+0

实际上,'cancelationTokenSource.Cancel'不会以'Thread.Abort'的方式取消任务 - 相反它会告诉任务在_和__时停止,并且如果任务询问其CancellationToken是否应该停止下次。此外,任务已经知道它的'CancellationToken',它传递到'Task.Run'只是让其地位变得'Canceled',而不是'Failed'如果令牌抛出一个'TaskCanceledException' ... – Haukinger

+0

没有必要注销在这种情况下,由于对WaitAll()的调用,所有任务都已完成; –

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()); 

基本上使得它运行启动任务,然后开始下一个循环之前等待它的内部。

我建议使用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();

取消见https://blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/recommended-patterns-for-cancellationtoken/

您需要提供更多关于你把列表1中为更好的建议的任务。