Popular blog tags

每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.

并发

在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于

while(1)

{

if(flag==1)

break;

sleep(1);

}

这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。

阻 塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行 其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道 CPU是数着纳秒过日子的。

所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。

同 样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做“并发”,这和并行是有着本质的不同的。并发是“伪并行”,看似并行,而实际上还是一个CPU在 执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程 序就会假死,因为程序在忙着执行,没空搭理用户的其他操作。

 

并行和并发

c#多核编程的简单使用,其实主要是Task类使用.

创建Task

创建Task的方法有两种,一种是直接创建——new一个出来,一种是通过工厂创建。下面来看一下这两种创建方法:

//第一种创建方式,直接实例化
         var task1 = new Task(() =>
         {
            //TODO you code
         });

 

//第二种创建方式,工厂创建
         var task2 = Task.Factory.StartNew(() =>
         {
            //TODO you code
         });

 

 

异步编程的核心是 Task 和 Task<T> 对象,这两个对象对异步操作建模。 它们受关键字 async 和 await 的支持。 在大多数情况下模型十分简单:

对于 I/O 绑定代码,等待一个在 async 方法中返回 Task 或 Task<T> 的操作。
对于 CPU 绑定代码,等待一个使用 Task.Run 方法在后台线程启动的操作

 Prerequisites
This sample is written in C# and targets .NET Core 3.1. It requires the .NET Core 3.1 SDK.

ParallelEnumerable.Range
Parallel.For
Parallel.ForEach
Partitioner.Create

c#Task多核编程

http://www.codeproject.com/Articles/362996/Multi-core-programming-using-Task-Parallel-Library

https://blog.csdn.net/xuwei_xuwei/article/details/18817859

.NET Core parallel computation of PI

https://docs.microsoft.com/en-us/samples/dotnet/samples/parallel-programming-compute-pi-cs/

在 .NET Core 中的并发编程

https://blog.csdn.net/sD7O95O/article/details/79128901

异步编程

https://docs.microsoft.com/zh-cn/dotnet/csharp/async