c# 基于任务的异步编程模式(基于任务的异步编程模式(TAP))
异步编程是C#5.0的一个重要改进,提供两个关键字:async和await。使用异步编程,方法的调用是在后台运行(通常在线程
或任务的帮助下),但不会阻塞调用线程。异步模式分为3种:异步模式、基于事件的异步模式和基于任务的异步模式
(TAP)。TAP是利用关键字async和await实现的,本文将讲解TAP模式。async和await关键字只是编译器的功能。编译器最
终会用Task类创建代码。
1、创建任务、创建任务
建立一个同步方法Greeting,该方法在等待一段时间后,返回一个字符串。
private string Greeting(int delay, string name)
{
System.Threading.Thread.Sleep(delay);
return string.Format("Hello, {0}.", name);
}
定义一个方法GreetingAsync,可以使方法异步化,其传入的参数不做强制要求。基于任务的异步模式指定,并返回一个任
务。注意,该方法返回的是Task<string>,定义了一个返回字符串的任务,与同步方法返回值一致。
private Task<string> GreetingAsync(string name, int delay = 3000)
{
return Task.Run<string>(() =>
{
return Greeting(delay, name);
});
}
2、调用异步方法、调用异步方法
可以使用await关键字调用返回任务的异步方法GreetingAsync。但是,使用await关键字的方法必须要用async关键字修饰符声
明。在GreetingAsync方法完成前,被async关键字修饰的方法内await关键字后面的代码不会继续执行。但是,启动被async
关键字修饰的方法的线程可以被重用,而没有被阻塞。
public async void CallerWithAsync()
{
string result = await GreetingAsync("Nigel", 2000);
Console.WriteLine(result);
}
注意:async修饰符修饰只能用于返回Task或void的方法。不能作为程序的入口点,即Main方法不能使用async修饰符。await
修饰符只能用于返回Task的方法。
3、延续任务、延续任务
GreetingAsync方法返回一个Task<string>对象。该对象包含任务创建的信息,并保存到任务完成。Task类的ContinueWith方
法可在任务完成后继续调用的代码。
public void CallsWithContinuationTask()
{
Task<string> task = GreetingAsync("Stephanie", 1000);
task.ContinueWith(t =>
{
Console.WriteLine(t.Result);
});
}
实际上,编译器会把await关键字后的所有代码放进ContinueWith方法内。不论是await关键字的方法还是任务的ContinueWith
方法,在方法的不同生命阶段使用了不同的线程。都是当await关键字的方法或任务执行完毕后,再由另一个线程去执行await
关键字后面的代码,或给当前线程添加新的任务去执行相关代码。
在具有UI的应用程序中,应用程序的窗体的控件不允许跨线程访问,需要使用控件的InvokeRequired属性和Invoke方法,将访
问UI的方法代码块以委托的形式传递给控件的Invoke,但是在执行前需要判断控件的InvokeRequired。在使用async和await关
键字,当await完成后,不需要做任何处理,就可以放访问UI线程(实际上是将控制权又交给了UI线程)。
4、使用多个异步方法、使用多个异步方法
4.1、按顺序调用多个异步方法
使用await关键字可以调用每个异步方法。如果一个异步方法依赖于另一个异步方法,将会起到很大作用。但当异步方法之间
没有相互依赖的时候,不使用await关键字将更快返回结果。
评论0
最新资源