C# 是一种广泛使用的面向对象编程语言,具有许多优秀的特性,例如面向对象编程、类型安全和强类型检查等。在 C# 中,可以使用并行和串行方式来处理任务,以提高程序的性能和效率。本文将介绍如何使用 C# 编写一个例子来实现任务的串行和并行。
一个例子
等待任务的方法包括等待它们执行完成,可以通过调用它们的 Wait 方法,或者查看它们的 Result 属性。另外,我们也可以调用 Task.WaitAll 等待所有任务执行完成,或者调用 Task.WaitAny 等待任意一个任务执行完成。
在C#中,处理线程等待和延续的任务可以通过Task类来实现。Task类是.NET 中的一部分,提供了一种简单而强大的方式来处理异步操作。
在C#中,Task类型是一种委托类型,它可以被用来在异步编程中传递一个操作,并在操作完成后返回一个结果。Task类型中的T表示任务的返回值类型。通过使用Task类型,可以使得异步编程更加灵活和高效。
Task类型可以用于许多场景,例如:
发起网络请求:当需要发起网络请求时,可以使用Task类型来处理请求并返回结果。例如,可以使用Task类型来处理服务器返回的HTTP响应。
执行I/O操作:当需要执行I/O操作时,例如读取文件或连接到数据库,可以使用Task类型来处理I/O操作并返回结果。例如,可以使用Task类型来处理文件读取操作。
处理事件:当需要处理事件时,例如消息队列中的消息,可以使用Task类型来处理事件并返回结果。例如,可以使用Task类型来处理消息队列中的消息。
在使用Task类型时,需要注意以下几点:
Task类型返回的是一个Task对象,而不是任务本身。因此,在处理Task对象时,需要使用Task.Result或Task.Exception等方法来获取任务的结果或异常信息。
Task类型中的T表示任务的返回值类型,因此需要确保任务返回的值类型与任务调用时传入的参数类型匹配。
Task类型的任务执行过程中可能会发生异常,因此需要使用try-catch语句来处理异常。
在C#中,根据应用程序的类型和需求,可以选择不同的方式来启动任务(Task)。这些启动方式主要通过System.Threading.Tasks.Task类或System.Threading.Tasks.Task<TResult>类来实现,适用于执行异步操作。
Task的启动方式一共有4种。
t1通过调用 Task 类构造函数进行实例化,但仅在任务t2启动后调用其Start()方法启动。t2 通过调用 TaskFactory.StartNew(Action, Object) 方法在单个方法调用中实例化和启动。
t3 通过调用 Run(Action) 方法在单个方法调用中实例化和启动。t4 通过调用 RunSynchronously() 方法在主线程上同步执行。调用Start方法
首先创建一个Task的实例,然后调用它的Start方法来启动任务。这种方式相比Task.Run和Task.Factory.StartNew较少使用,因为它需要两步来启动任务,而上述方法只需要一步。
Task是微软在.Net 4.0时代推出来的,也是微软极力推荐的一种多线程的处理方式,Task看起来像一个Thread,实际上,它是在ThreadPool的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool。
类 Task 表示不返回值且通常异步执行的单个操作。 Task对象是.NET Framework 4 中首次引入的基于任务的异步模式的核心组件之一。 由于对象执行 Task 的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行,因此可以使用 Status 属性以及 IsCanceled、 IsCompleted和 IsFaulted 属性来确定任务的状态。 大多数情况下,lambda 表达式用于指定任务要执行的工作。
TaskStatus表示 Task 的生命周期中的当前阶段。
| Canceled | 6 | 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号。 有关详细信息,请参阅任务取消。 |
| Created | 0 | 该任务已初始化,但尚未被计划。 |
| Faulted | 7 | 由于未处理异常的原因而完成的任务。 |
| RanToCompletion | 5 | 已成功完成执行的任务。 |
| Running | 3 | 该任务正在运行,但尚未完成。 |
| WaitingForActivation | 1 | 该任务正在等待 .NET 基础结构在内部将其激活并进行计划。 |
| WaitingForChildrenToComplete | 4 | 该任务已完成执行,正在隐式等待附加的子任务完成。 |
| WaitingToRun | 2 | 该任务已被计划执行,但尚未开始执行。 |