惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
量子位
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
Latest news
Latest news
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
NISL@THU
NISL@THU
T
Tor Project blog
Hacker News: Ask HN
Hacker News: Ask HN
V2EX - 技术
V2EX - 技术
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
博客园 - 叶小钗
博客园 - 聂微东
Last Week in AI
Last Week in AI
爱范儿
爱范儿
腾讯CDC
博客园 - Franky
美团技术团队
J
Java Code Geeks
O
OpenAI News
L
Lohrmann on Cybersecurity
Simon Willison's Weblog
Simon Willison's Weblog
有赞技术团队
有赞技术团队
T
Threatpost
G
GRAHAM CLULEY
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
I
Intezer
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
S
Security @ Cisco Blogs
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
Stack Overflow Blog
Stack Overflow Blog
Scott Helme
Scott Helme
H
Hacker News: Front Page
Cloudbric
Cloudbric

博客园 - 新西兰程序员

C++ 构造函数中的初始化参数列表initializer list C++中的线程thread,以及C++11中的std::atomic学习 Leetcode56 Merge Intervals 合并区间 -- C++实现 C++中的内存对齐 C++中的static关键字使用以及全局变量 C++17中的结构化绑定Structured Binding C++中的函数参数是指针类型, 是按值传递 C++中异常处理机制中的栈展开stack unwinding C++实现链表反转 Linux中的性能分析工具 perf 来分析C++性能 C++17中新建一个类时,编译器默认生成的类成员函数 QT中的元对象系统 Leetcode 114 - 二叉树展开为链表 Leetcode65 有效数字 - 判断给定的字符串是否是一个有效数字 LettCode2289-Steps to Make Array Non-descreasing C#中的委托详解 C++中的std::function C++中的仿函数Functor C++中的const和constexpr异同比较 C++中的左值和右值,以及右值引用,移动语义 C++中传递参数是指针类型以及传入参数是指针的指针(**)详解 C++中GetTickCount函数学习 C++中以类的成员函数作为Windows callback函数需要设置成static函数 C#中的System.Security.SecureString学习 C++中的悬挂指针和野指针 C++中四种不同的对象生存方式(in stack, in heap, global, local static) String类型转LPCTSTR -----理解C++中的字符串类型转换 C++中的虚函数和虚函数表 C++中基类指针指向派生类对象 数据结构 - 栈的学习
C#中使用Parallel类来进行多线程并发编程
新西兰程序员 · 2024-04-17 · via 博客园 - 新西兰程序员

在新西兰工作时,有一次的面试中问到了Parallel类进行多线程编程

我们知道,C#中实现多线程编程有多种方式,包括

1. 使用Thread开启一个新的线程

2. 使用Parallel类

3. 使用Task

我们今天来说一下C#中的Parallel类,Parallel类是C#中可以用来进行多线程编程的一个类,它让我们可以像写传统代码一样来编写C#中的多线程程序,它有3个比较常用的方法:

Parallel.For()  => 开启多线程来循环执行一段代码

Parallel.ForEach() => 开启多线程遍历处理一个对象集合

Parallel.Invoke() => 开启多线程执行多个方法

 好,接下来,我们来看一个使用Parallel.For()的例子

public void ParallelForTest()
{
Parallel.For(1,10,i => {
Console.WriteLine(string.Format("i = {0}", i));
}); }

这段代码很容易理解,循环输出1到10.  你是不是以为输出会是这样:

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9

如果是个for循环,那肯定是这样的,因为for循环是个单线程,就是按照顺序来一个一个输出

而这里,Parallel.For => 采用的是多线程,也就是说输出 i =1时可能在线程1上执行,输出 i = 2时可能在线程5上执行 , 输出 i = 3时可能又在线程1上了,它没法保证是按照顺序来输出1,2,3,4,....所以它输出结果是乱序的,它的结果如下

i = 1
i = 5
i = 3
i = 4
i = 7
i = 9
i = 2
i = 6
i = 8

接下来我们看看ParallelForEach的使用

public void parallelForEachTest()
{
            //构造泛型集合数据
            List<User> userList = new List<User>
            {
                new User{ UserId=1,UserName="张三" },
                new User{ UserId=2,UserName="李四" },
                new User{ UserId=3,UserName="王五" },
                new User{ UserId=4,UserName="赵六" },
                new User{ UserId=5,UserName="大师兄" }
            };
 
            //Parallel.ForEach 计算循环时间
            string testName = string.Empty; 
            Stopwatch sw = new Stopwatch();
            sw.Start(); //计时开始
            Parallel.ForEach(userList, u => //多线程遍历
            {
                testName += u.UserName + ",";
                Thread.Sleep(10);//模拟一个耗时操作,以免看不到效果
            });
            sw.Stop(); //计时结束
}

关于Parallel.Invoke() 具体可以自己查阅相关资料