任务列表如何停止任务C#

时间:2016-05-14 16:58:59

标签: c# list task

如何停止列表中的任务再次实现。

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

2 个答案:

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

检查取消

请参阅https://blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/recommended-patterns-for-cancellationtoken/

您需要提供有关列入list1的任务的更多信息,以获得更好的建议。