多线程是一种有效提高程序工作效率的方法。当然为了效率需要使用更多的cpu,内存等资源。

并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。

并发和并行都可以是很多个线程,就看这些线程能不能同时被(多个)cpu执行,如果可以就说明是并行,而并发是多个线程被(一个)cpu 轮流切换着执行。

运行一个线程

  class Program
{
static void Main(string[] args)
{
new Thread(Go).Start(); // .NET 1.0开始就有的
Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL
Task.Run(new Action(Go)); // .NET 4.5 新增了一个Run的方法
Console.WriteLine("我是Main线程 {0}", Thread.CurrentThread.ManagedThreadId.ToString());
var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); });
Console.WriteLine("今天是:{0}", dayName.Result);
Console.ReadLine(); }
public static void Go()
{
Console.WriteLine("我是另一个线程 {0}", Thread.CurrentThread.ManagedThreadId.ToString());
} public static string GetDayOfThisWeek()
{
return string.Format("结果{0}", Thread.CurrentThread.ManagedThreadId.ToString());
}
}

TaskFactory 类

  • 创建一个任务,并通过调用立即启动该 StartNew 方法

任务等待

  • 创建一个任务,在数组中的任务之一通过调用完成后开始 ContinueWhenAny 方法。

  • 创建一个任务,在数组中的所有任务已都完成通过调用开始 ContinueWhenAll 方法。

AsyncState

获取在创建 Task 时提供的状态对象,如果未提供,则为 null。

CompletedTask

获取一个已成功完成的任务。

CreationOptions

获取用于创建此任务的 TaskCreationOptions

CurrentId

返回当前正在执行 Task 的 ID。

Exception

获取导致 AggregateException 提前结束的 Task。 如果 Task 成功完成或尚未引发任何异常,这将返回 null

Factory

提供对用于创建 Task 和 Task<TResult> 的工厂方法的访问。

Id

获取此 Task 实例的 ID。

IsCanceled

获取此 Task 实例是否由于被取消的原因而已完成执行。

IsCompleted

获取此 Task 是否已完成。

IsFaulted

获取 Task 是否由于未经处理异常的原因而完成。

Status

获取此任务的 TaskStatus

https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task(v=vs.110).aspx

当然这里并不考虑对共享数据的操作,多个线程在对同一数据源进行操作的时候,不控制顺序可能会产生意想不到的后果。

.Net 多线程 (1) Task的更多相关文章

  1. 【多线程】 Task ,async ,await

    [多线程]Task ,async ,await 一. WinForm 里经常会用到多线程, 多线程的好出就不多说了,来说说多线程比较麻烦的地方 1. UI 线程与其他线程的同步,主要是 Form 和 ...

  2. 【多线程】 Task

    [多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...

  3. 【多线程】Task

    介绍 Task是.NET推出数据任务处理的工作类.位于System.Threading.Tasks命名空间下,通过命名空间也可以看出是个多线程类. 创建Task: Task有很多构造函数,无参有参都有 ...

  4. 多线程(4)Task

    使用线程池使得创建线程已经很简单了,但是使用线程池不支持线程的取消,完成和失败通知等交互操作,为了解决这些问题,.net 4.0带来了TPL(Task Parallel Library)任务并行库,下 ...

  5. C#多线程编程のTask(任务全面解析)

    Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程. 我们可以说Task是一种基于任务的 ...

  6. C# 应用 - 多线程 3) Task.Factory

    1. 与 Task.Run() 的区别: 先看一下源码: public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable { pu ...

  7. C# 应用 - 多线程 4) Task cancel

    1. 操作取消 1.1 步骤 实例化 CancellationTokenSource 对象,该对象管理取消通知并将其发送给单个取消标记 将 CancellationTokenSource.Token ...

  8. Task/Parallel实现异步多线程

    代码: #region Task 异步多线程,Task是基于ThreadPool实现的 { //TestClass testClass = new TestClass(); //Action<o ...

  9. .NET多线程(Thread,ThreadPool,Task,Async与Await)

    .NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...

随机推荐

  1. python 文档

    python 文档 https://docs.python.org/2/library/index.html

  2. CUDA加opencv复现导向滤波算法

    CUDA是GPU通用计算的一种,其中现在大热的深度学习底层GPU计算差不多都选择的CUDA,在这我们先简单了解下其中的一些概念,为了好理解,我们先用DX11里的Compute shader来和CUDA ...

  3. 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  4. linux windows安装python的最佳方式,miniconda

    1.在linux安装python文章很多,但是步骤很多,没搞好还会把yum命令弄坏,要修复.这件事就发生在我身上,准确说不是我造成的,是总监自己安装python造成yum损坏的,然后需要运维去百度修改 ...

  5. xdebug php 运行效率分析工具

    Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. 官网:https://xdebug.org/index.php 安装方法: ht ...

  6. windows安装mysql8

    1:首先去官网下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 2:将解压文件解压到你安装的目录:E:\mysql-8.0.11-winx64  (我 ...

  7. 解决Office 2016客户端如何同SharePoint Server2016安装在一起

    前言 Microsoft Office 2016 客户端默认使用新式验证. 在某些配置中,新式验证不受安装有 SharePoint Server 2016 的 Office 2016 客户端的支持,例 ...

  8. Ps去除背景

    http://www.16xx8.com/photoshop/jiaocheng/26905.html

  9. npm笔记

    #执行npm start时是运行的哪个js文件? 打开package.json看看scripts属性中start配置的是什么运行脚本,这里配置的就是你执行npm start时跑的脚本 #设置npm的源 ...

  10. Spark application注册master机制

    直接上Master类的代码: case RegisterApplication(description) => { if (state == RecoveryState.STANDBY) { / ...