在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 | 该任务已被计划执行,但尚未开始执行。 |
大家会发现,C# await还是等待了呀,没有提升什么呀?
await调用的等待期间,NET会把当前的线程返回给线程池等异步方法调用执行完毕后,框架会从线程池再取出来一个线程执行后续的代码。
await提升了性能?当我们说await提升了性能时,我们实际上是在强调异步编程模型的优势。通过使用await,应用程序可以在等待异步操作完成时释放当前线程,这意味着线程可以用来执行其他任务,从而提高了应用程序的响应性和吞吐量。这在处理大量并发请求的服务器应用程序或提高UI应用程序响应性时特别有用。
写一个例子
C#static async Task Main(string[] args)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++)
{
sb.AppendLine("hi.....");
}
await File.WriteAllTextAsync("./a.txt", sb.ToString());
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
Async/Await是C# 5引入的关键字,旨在提高用户界面响应能力和对Web资源的访问能力,同时它使异步代码的编写变得更加容易。在C#中,异步编程可以使代码更加简洁、高效和易于维护。异步编程的一个重要挑战是处理异步操作完成后的结果,以避免阻塞主线程并保持用户界面的响应性。
microsoft 的一篇文档 Task asynchronous programming model,它描述了在异步编程中控制流是如何在方法之间移动的。
使用C#的异步编程可以非常方便地完成下载文件的功能。异步编程是指一种编程模型,其中某些操作不会阻塞程序的执行,而是在异步线程中执行。这种方式可以提高程序的性能,并且可以避免阻塞其他操作的执行。在下载文件的情境下,使用异步编程可以保证下载进程的顺利进行,而不会导致整个程序的崩溃。
不带返回例子
C#internal class Program
{
static async Task Main(string[] args)
{
await DownloadHtmlAsync("http://www.baidu.com", "baidu.txt");
}
static async Task DownloadHtmlAsync(string url, string filename)
{
using (HttpClient client = new HttpClient())
{
string html = await client.GetStringAsync(url);
await File.WriteAllTextAsync("./" + filename, html);
}
}
}