.Net 多线程 (1) Task
多线程是一种有效提高程序工作效率的方法。当然为了效率需要使用更多的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的更多相关文章
- 【多线程】 Task ,async ,await
[多线程]Task ,async ,await 一. WinForm 里经常会用到多线程, 多线程的好出就不多说了,来说说多线程比较麻烦的地方 1. UI 线程与其他线程的同步,主要是 Form 和 ...
- 【多线程】 Task
[多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...
- 【多线程】Task
介绍 Task是.NET推出数据任务处理的工作类.位于System.Threading.Tasks命名空间下,通过命名空间也可以看出是个多线程类. 创建Task: Task有很多构造函数,无参有参都有 ...
- 多线程(4)Task
使用线程池使得创建线程已经很简单了,但是使用线程池不支持线程的取消,完成和失败通知等交互操作,为了解决这些问题,.net 4.0带来了TPL(Task Parallel Library)任务并行库,下 ...
- C#多线程编程のTask(任务全面解析)
Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程. 我们可以说Task是一种基于任务的 ...
- C# 应用 - 多线程 3) Task.Factory
1. 与 Task.Run() 的区别: 先看一下源码: public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable { pu ...
- C# 应用 - 多线程 4) Task cancel
1. 操作取消 1.1 步骤 实例化 CancellationTokenSource 对象,该对象管理取消通知并将其发送给单个取消标记 将 CancellationTokenSource.Token ...
- Task/Parallel实现异步多线程
代码: #region Task 异步多线程,Task是基于ThreadPool实现的 { //TestClass testClass = new TestClass(); //Action<o ...
- .NET多线程(Thread,ThreadPool,Task,Async与Await)
.NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...
随机推荐
- Web重温系列(二):SQLite+EF6实现本地化存储
本来我们的产品有着复杂的层次结构,作为客户端的C# WinForm是不操作数据库的.但是最近有个需求,需要将数据本地保存.可选的方案很多,比如文本文件或者XML序列化和反序列化,或者如access.d ...
- Git:git diff 命令详解
工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...
- String 类型的值能够被反射改变从而引发的意外事件
今天刷技术文章,遇到了一个问题,用 Java 反射机制去修改 String 变量的值,出于深入研究,就发现了一个问题,即,用初始值比较修改后的值,用 == or .equals() 方法,出现了相等的 ...
- Golang 笔记 5 go语句
Go语句和通道类型是Go语言的并发编程理念的最终体现.与defer语句相同,go语句也可以携带一个表达式语句.Go语句的执行会很快结束,并不会对当前流程的进行造成阻塞或明显的延迟.一个简单的示例: ...
- LeetCode - 703. Kth Largest Element in a Stream
Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...
- TimeUnit类中的sleep() 和Thread.sleep()
TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段 ...
- iOS - 数组字典模型根据模型属性key排序
方法一: NSArray *sortArray = [arrayM sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { ...
- HTML禁止右键复制【两行代码实现】
很多的站长朋友会考虑保护网站的内容不被人复制,或者是不被人轻易的复制,下面就来告诉如何用两行代码来做HTML禁止右键复制html的方法: document.oncontextmenu=new Func ...
- 关于Intel漏洞的学习
这几天报道了Intel的漏洞,这里学习一下并做个记录. 报告:https://spectreattack.com/spectre.pdf #include <stdio.h> #inclu ...
- 【Java线程安全】 — ThreadLocal
[用法] 首先明确,ThreadLocal是用空间换时间来解决线程安全问题的,方法是各个线程拥有自己的变量副本. 既然如此,那么是涉及线程安全,必然有一个共享变量,我给大家声明一个: public c ...

