.Net 多线程 (1) Task

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

.Net 多线程 (1) Task

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

 

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

 运行一个线程

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             new Thread(Go).Start();  // .NET 1.0开始就有的
 6             Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL
 7             Task.Run(new Action(Go)); // .NET 4.5 新增了一个Run的方法
 8             Console.WriteLine("我是Main线程 {0}", Thread.CurrentThread.ManagedThreadId.ToString());
 9             var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); });
10             Console.WriteLine("今天是:{0}", dayName.Result);
11             Console.ReadLine();
12             
13         }
14         public static void Go()
15         {
16             Console.WriteLine("我是另一个线程 {0}", Thread.CurrentThread.ManagedThreadId.ToString());
17         }
18 
19         public static string GetDayOfThisWeek()
20         {
21             return string.Format("结果{0}", Thread.CurrentThread.ManagedThreadId.ToString());
22         }
23     }

.Net 多线程 (1) Task

TaskFactory 类

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

任务等待

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

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

.Net 多线程 (1) Task AsyncState

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

.Net 多线程 (1) Task.Net 多线程 (1) Task CompletedTask

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

.Net 多线程 (1) Task CreationOptions

获取用于创建此任务的 TaskCreationOptions

.Net 多线程 (1) Task.Net 多线程 (1) Task CurrentId

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

.Net 多线程 (1) Task Exception

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

.Net 多线程 (1) Task.Net 多线程 (1) Task Factory

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

.Net 多线程 (1) Task Id

获取此 Task 实例的 ID。

.Net 多线程 (1) Task IsCanceled

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

.Net 多线程 (1) Task IsCompleted

获取此 Task 是否已完成。

.Net 多线程 (1) Task IsFaulted

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

.Net 多线程 (1) Task Status

获取此任务的 TaskStatus

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

 

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