首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在c#中取消Parallel.ForEach中的单个任务或特定任务

在C#中,取消Parallel.ForEach中的单个任务或特定任务可以使用CancellationTokenSource和CancellationToken来实现。CancellationTokenSource是一个用于生成CancellationToken的工厂类,而CancellationToken则是一个用于取消操作的标记。

以下是一个示例代码,演示如何取消Parallel.ForEach中的单个任务或特定任务:

代码语言:txt
复制
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 创建一个CancellationTokenSource对象
        CancellationTokenSource cts = new CancellationTokenSource();

        // 获取CancellationToken
        CancellationToken token = cts.Token;

        // 创建一个并发队列用于存储任务结果
        ConcurrentQueue<int> results = new ConcurrentQueue<int>();

        // 启动Parallel.ForEach循环
        Parallel.ForEach(
            Enumerable.Range(1, 10),
            new ParallelOptions { CancellationToken = token },
            (i, loopState) =>
            {
                // 检查是否需要取消任务
                if (i == 5)
                {
                    // 取消特定任务
                    loopState.Stop();
                    return;
                }

                // 模拟任务执行
                Thread.Sleep(1000);

                // 将任务结果添加到并发队列中
                results.Enqueue(i);
            });

        // 输出任务结果
        foreach (int result in results)
        {
            Console.WriteLine(result);
        }

        Console.ReadLine();
    }
}

在上述示例中,我们首先创建了一个CancellationTokenSource对象,然后通过调用其Token属性获取了一个CancellationToken。接下来,我们使用Parallel.ForEach方法来执行一系列任务,通过将ParallelOptions的CancellationToken属性设置为我们获取的CancellationToken,以便在任务执行过程中检查是否需要取消任务。

在任务执行的委托中,我们首先检查当前任务的索引是否为5,如果是,则调用loopState.Stop()方法来取消特定任务。然后,我们模拟任务的执行,将任务结果添加到并发队列中。

最后,我们遍历并发队列,输出任务结果。

这里推荐腾讯云的云服务器CVM产品,它提供了高性能、可靠稳定的云服务器实例,适用于各种应用场景。您可以通过以下链接了解更多关于腾讯云服务器CVM的信息:腾讯云服务器CVM产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# 多线程七之Parallel

关于Parallel不想说太多,因为它是Task的语法糖,至少我是这么理解的,官方文档也是这么说的,它本身就是基本Task的.假设我们有一个集合,不管是什么集合,我们要遍历它,首先想到的是For(如何涉及到修改或者读可以用for)或者Foreach(如果单纯的读),但是它两是同步的去操作集合,但是使用Parallel的静态For或者Foreach那就可以让多个线程参与这个工作,这样就能充分的利用CPU,但是你需要考虑CPU上下文产生的性能消耗,以及Parallel本身的性能消耗,所以,这也能解释为什么,你的循环里面执行的是不耗时的操作,使用for或者foreach的速度比使用Parallel的要快,所以使用Parallel还是要慎重.而且使用Parallel还需要注意的一点就是,不能有多线程争用问题,就是你的循环体里面不能有操作静态资源的操作.如果真的需要,那你可以加锁,但是那就失去它的优势了.

04
领券