1、异步不等于多线程,但是可以由多个线程完成。
2、返回值:
无返回值Task,有返回值Task<类型>
写法:Async await
3、不要用Sleep
如果想要异步方法暂停一段时间,不要用Thread.Sleep(),因为它会阻塞调用的当前线程,而要用await Task.Delay()
4、CancellationToken
有时需要提前终止任务,比如:请求超时,用户取消请求。
很多异步方法都有CancellationToken参数,用于获得提前终止执行的信号。
static async Task Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(5000);
CancellationToken cToken = cts.Token;
await CancellationRequesteds.DownloadAsync("https://www.baidu.com",500, cToken);
}
/// <summary>
/// 异步编程
/// </summary>
/// <param name="url">访问请求</param>
/// <param name="n">次数</param>
/// <param name="cancellationToken">超时时间</param>
/// <returns></returns>
static async Task DownloadAsync(string url, int n, CancellationToken cancellationToken)
{
using (HttpClient client = new HttpClient())
{
for (int i = 0; i < n; i++)
{
string html = await client.GetStringAsync(url);
Console.WriteLine($"{DateTime.Now}:{html}");
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("取消请求");
break;
}
}
}
}
5、接口中的异步方法
接口中的方法或者抽象方法不能修饰为async