c# 并行运算

 

 

使用System.Collections.Concurrent命名空间下的类型来用于并行循环体内:

说明
BlockingCollection<T>为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻止和限制功能。
ConcurrentBag<T>表示对象的线程安全的无序集合。
ConcurrentDictionary<TKey, TValue>表示可由多个线程同时访问的键值对的线程安全集合。
ConcurrentQueue<T>表示线程安全的先进先出 (FIFO) 集合。
ConcurrentStack<T>表示线程安全的后进先出 (LIFO) 集合。
OrderablePartitioner<TSource>表示将一个可排序数据源拆分成多个分区的特定方式。
Partitioner提供针对数组、列表和可枚举项的常见分区策略。
Partitioner<TSource>表示将一个数据源拆分成多个分区的特定方式。
  1. /// <summary>
  2.         /// 并行循环操作集合类,集合内只取5个对象
  3.         /// </summary>
  4.         private void Demo7()
  5.         {
  6.             ConcurrentQueue<int> data = new ConcurrentQueue<int>();
  7.             Parallel.For(0, Program.Data.Count, (i) =>
  8.             {
  9.                 if (Program.Data[i] % 2 == 0)
  10.                     data.Enqueue(Program.Data[i]);//将对象加入到队列末尾
  11.             });
  12.             int R;
  13.             while (data.TryDequeue(out R))//返回队列中开始处的对象
  14.             {
  15.                 Console.WriteLine(R);
  16.             }
  17.             Console.WriteLine("执行完成For.");
  18.         }
  19.         /// <summary>
  20.         /// 并行循环操作集合类
  21.         /// </summary>
  22.         private void Demo8()
  23.         {
  24.             ConcurrentStack<int> data = new ConcurrentStack<int>();
  25.             Parallel.ForEach(Program.Data, (i) =>
  26.             {
  27.                 if (Program.Data[i] % 2 == 0)
  28.                     data.Push(Program.Data[i]);//将对象压入栈中
  29.             });
  30.             int R;
  31.             while (data.TryPop(out R))//弹出栈顶对象
  32.             {
  33.                 Console.WriteLine(R);
  34.             }
  35.             Console.WriteLine("执行完成ForEach.");
  36.         }

PLinq(Linq的并行计算)

    上面介绍完了For和ForEach的并行计算盛宴,微软也没忘记在Linq中加入并行计算。下面介绍Linq中的并行计算。

4.0中在System.Linq命名空间下加入了下面几个新的类:

说明
ParallelEnumerable提供一组用于查询实现 ParallelQuery{TSource} 的对象的方法。这是 Enumerable 的并行等效项。
ParallelQuery表示并行序列。
ParallelQuery<TSource>表示并行序列。

 

在ParallelEnumerable中提供的并行化的方法

 

ParallelEnumerable 运算符说明
AsParallel()PLINQ 的入口点。指定如果可能,应并行化查询的其余部分。
AsSequential()指定查询的其余部分应像非并行 LINQ 查询一样按顺序运行。
AsOrdered()指定 PLINQ 应保留查询的其余部分的源序列排序,直到例如通过使用 orderby 子句更改排序为止。
AsUnordered()指定查询的其余部分的 PLINQ 不需要保留源序列的排序。
WithCancellation()指定 PLINQ 应定期监视请求取消时提供的取消标记和取消执行的状态。
WithDegreeOfParallelism()指定 PLINQ 应当用来并行化查询的处理器的最大数目。
WithMergeOptions()提供有关 PLINQ 应当如何(如果可能)将并行结果合并回到使用线程上的一个序列的提示。
WithExecutionMode()指定 PLINQ 应当如何并行化查询(即使默认行为是按顺序运行查询)。
ForAll()多线程枚举方法,与循环访问查询结果不同,它允许在不首先合并回到使用者线程的情况下并行处理结果。
Aggregate() 重载对于 PLINQ 唯一的重载,它启用对线程本地分区的中间聚合以及一个用于合并所有分区结果的最终聚合函数。

 

  1. /// <summary>
  2.         /// PLinq简介
  3.         /// </summary>
  4.         private void Demo11()
  5.         {
  6.             var source = Enumerable.Range(1, 10000);
  7.             //查询结果按source中的顺序排序
  8.             var evenNums = from num in source.AsParallel().AsOrdered()
  9.                        where num % 2 == 0
  10.                        select num;
  11.             //ForAll的使用
  12.             ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();
  13.             var query = from num in source.AsParallel()
  14.                         where num % 10 == 0
  15.                         select num;
  16.             query.ForAll((e) => concurrentBag.Add(e * e));
  17.         }

 

 

转载于:https://www.cnblogs.com/mrray/p/10782779.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C#并行运行Timer,可以使用Task Parallel Library(TPL)提供的功能。以下是一个示例代码: ```csharp using System; using System.Threading; using System.Threading.Tasks; class Program { static void Main() { // 创建一个 Timer 对象 Timer timer = new Timer(TimerCallback, null, 0, 1000); // 创建一个 CancellationTokenSource 对象,用于取消任务 CancellationTokenSource cts = new CancellationTokenSource(); // 创建并行任务 Task[] tasks = new Task[3] { Task.Factory.StartNew(() => DoWork(cts.Token)), Task.Factory.StartNew(() => DoWork(cts.Token)), Task.Factory.StartNew(() => DoWork(cts.Token)) }; // 等待所有任务完成 Task.WaitAll(tasks); // 停止 Timer timer.Dispose(); } static void TimerCallback(object state) { Console.WriteLine("Timer callback executed."); } static void DoWork(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { // 执行一些工作... Console.WriteLine("Doing work..."); // 模拟工作的延迟 Thread.Sleep(2000); } } } ``` 在这个示例中,我们创建了一个Timer对象,并设置它的回调函数。然后,我们使用Task Parallel Library创建了3个并行任务,并在每个任务中执行DoWork方法。DoWork方法是一个无限循环,在循环内部执行一些工作,并使用Thread.Sleep模拟工作的延迟。任务会一直执行,直到取消标记被设置。最后,我们等待所有任务完成,并停止Timer对象。 请注意,为了在DoWork方法中能够检查取消标记,我们将CancellationToken作为参数传递给DoWork方法。这样,当我们调用cts.Cancel()时,任务会收到取消请求,并停止执行。 希望这能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值