Parallel.ForEach , ThreadPool.QueueUserWorkItem

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7
 8 namespace ParallelThreadPool
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             List<int> list = InitialList(100);
15             Console.WriteLine("ParallelList开始");
16             ParallelList(list);
17             Console.WriteLine("ThreadPoolList开始");
18             ThreadPoolList(list);
19             Console.ReadKey();
20         }
21
22         /// <summary>
23         /// 初始化队列
24         /// </summary>
25         /// <param name="length"></param>
26         /// <returns></returns>
27         private static List<int> InitialList(int length)
28         {
29             List<int> list = new List<int>();
30             for (int i = 0; i < length; i++)
31             {
32                 list.Add(i);
33             }
34             return list;
35         }
36
37         /// <summary>
38         /// Paralle循环
39         /// </summary>
40         /// <param name="list"></param>
41         private static void ParallelList(List<int> list)
42         {
43             Parallel.ForEach(list, (item) =>
44             {
45                 Console.WriteLine(string.Format("Paralle循环,元素{0}", item));
46             });
47             Console.WriteLine("-----------------------------------Paralle----------------------------------");
48         }
49
50         /// <summary>
51         /// ThreadPool循环
52         /// </summary>
53         /// <param name="list"></param>
54         private static void ThreadPoolList(List<int> list)
55         {
56             ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
57             {
58                 foreach (var item in list)
59                 {
60                     Console.WriteLine(string.Format("ThreadPool循环,元素{0}", item));
61                 }
62             }));
63             Console.WriteLine("-----------------------------------ThreadPool----------------------------------");
64         }
65     }
66 }

Parallel.ForEach:执行foreach操作,其中可能会并行迭代。

ThreadPool.QueueUserWorkItem:将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。

仅作为自己记录一下,验证猜想:

Parallel.ForEach不异步,并行迭代,执行顺序会乱。

ThreadPool.QueueUserWorkItem 开线程,异步不影响后面代码执行,按照队列顺序一个个执行。

时间: 2024-08-26 23:45:49

Parallel.ForEach , ThreadPool.QueueUserWorkItem的相关文章

何时使用 Parallel.ForEach,何时使用 PLINQ

翻译自:When Should I Use Parallel.ForEach? When Should I Use PLINQ? 原作者: Pamela Vagata, Parallel Computing Platform Group, Microsoft Corporation 原文pdf:http://download.csdn.net/detail/sqlchen/7509513 ======================================================

线程(Thread,ThreadPool)、Task、Parallel

线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Framework中的线程分为两类:1.前台线程:2.后台线程. 1.前台线程 class Program { static void Main(string[] args) { Console.WriteLine("=====Thread====="); TestThread(); Cons

多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比

Thread.Start(),ThreadPool.QueueUserWorkItem都是在实现多线程并行编程时常用的方法.两种方式有何异同点,而又该如何取舍? 写一个Demo,分别用两种方式实现.观察各自的现象. 一个WorkMan class,其内的method doSomething()是每次异步线程调用的方法.该方法只是随机的让线程休眠一段时间. 1 public void doSomething() 2 { 3 OnBegin(new EventArgs()); 4 5 // some

C#并发实战Parallel.ForEach使用

前言:最近给客户开发一个伙食费计算系统,大概需要计算2000个人的伙食.需求是按照员工的预定报餐计划对消费记录进行检查,如有未报餐有刷卡或者有报餐没刷卡的要进行一定的金额扣减等一系列规则.一开始我的想法比较简单,直接用一个for循环搞定,统计结果倒是没问题,但是计算出来太慢了需要7,8分钟.这样系统服务是报超时错误的,让人觉得有点不太爽.由于时间也不多就就先提交给用户使用了,后面逻辑又增加了,计算时间变长,整个计算一遍居然要将近10分钟了.这个对用户来说是能接收的(原来自己手算需要好几天呢),但

.NET 异步多线程,Thread,ThreadPool,Task,Parallel

今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一下进化史了 1:委托异步多线程,所有的异步都是基于委托来实现的 #region 委托异步多线程 { //委托异步多线程 Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine($"开始执行了,{DateTime.Now.

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题

ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序会出现闪退.当然是指不处理那个异常的情况下.这不公司的CMS在生产环境频频出现闪退的情况.该死的是,原来用老机器配置不高的情况下没有出现过.换了更好的新机器后出现的. // // 摘要: // 将方法排入队列以便执行,并指定包含该方法所用数据的对象.此方法在有线程池线程变得可用时执行. // //

ThreadPool.QueueUserWorkItem的用法,带参数和不带参数

1,带参数 ThreadPool.QueueUserWorkItem(delegate { PostDataWhenLoadData(); }); pubic static void update() { } 2.不带参数(参数类型一定要写成object) ThreadPool.QueueUserWorkItem(Checkupdate); public static void update(object data) { } 原文地址:https://www.cnblogs.com/xyyshi

Parallel.Foreach的全部知识要点【转】

简介 当需要为多核机器进行优化的时候,最好先检查下你的程序是否有处理能够分割开来进行并行处理.(例如,有一个巨大的数据集合,其中的元素需要一个一个进行彼此独立的耗时计算). .net framework 4 中提供了 Parallel.ForEach 和 PLINQ 来帮助我们进行并行处理,本文探讨这两者的差别及适用的场景. Parallel.ForEach Parallel.ForEach 是 foreach 的多线程实现,他们都能对 IEnumerable<T> 类型对象进行遍历,Para

线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程.对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦出现异常没有捕获,将会带来难以发现的bug,进而造成系统崩溃.而多线程本身也不是一朝一夕就能学好的,必须不断的去学习总结,所以我个人认为你要用一种线程模型,首先要对它有足够的了解,特别是对异常的捕获.如果你没有完全的把握,最好在实际开发中谨慎的用多线程. 1,APM异步编程模型. 采用BeginXX