时间:2021-11-15 16:35:13 | 栏目:.NET代码 | 点击:次
异步编程的核心是 Task
和 Task<T>
对象,这两个对象对异步操作建模。 它们受关键字 async
和 await
的支持。 在大多数情况下模型十分简单:
对于 I/O 绑定代码,当你 await
一个操作,它将返回 async
方法中的一个 Task
或 Task<T>
。
对于 CPU 绑定代码,当你 await
一个操作,它将在后台线程通过 Task.Run()
方法启动。
static async Task Main(string[] args) { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(5000); //超时5s后取消 await DownloadString("http://www.baidu.com", 50, cts.Token); }
if (cancellationToken.IsCancellationRequested) { Console.WriteLine("任务被取消"); break; }
cancellationToken.ThrowIfCancellationRequested();
系统自带的异步方法,只需要传参数就可取消,抛出异常
var resp= await client.GetAsync(url,cancellationToken);
static async Task Main(string[] args) { CancellationTokenSource cts = new CancellationTokenSource(); //cts.CancelAfter(5000); DownloadString("http://www.baidu.com", 100, cts.Token); //和超时区别在于去掉了前面的await 才生效 while (Console.ReadLine() != "q") { } cts.Cancel(); Console.ReadLine(); }
.Asp.net core Mvc
控制器里面的异步方法尽量带 CancellationToken
WhenAny
任何一个Task
完成,task
就完成WhenAll
所有任务都完成,才完成 。 不在乎Task
执行顺序FromResult
创建普通数值的Task
对象yield 可以流水线返回,提高性能。
C# 8.0以上支持 yield异步方法的使用
static async IAsyncenumerable<string> test() { yield return "a"; yield return "b"; yield return "c"; }
调用:
await foreach(var o in test()) { Console.WriteLine(o); }
public static async Task DownloadString(string url,int num,CancellationToken cancellationToken) { try { using (var client = new HttpClient()) { for (int i = 0; i < num; i++) { string html = await client.GetStringAsync(url); Console.WriteLine($"{DateTime.Now}:{html}"); //1.手动取消 if (cancellationToken.IsCancellationRequested) { Console.WriteLine("任务被取消"); break; } //2.抛出异常 //cancellationToken.ThrowIfCancellationRequested(); } } } catch (Exception) { throw; } } public static async Task Download2String(string url, int num, CancellationToken cancellationToken) { using (var client = new HttpClient()) { for (int i = 0; i < num; i++) { var resp= await client.GetAsync(url,cancellationToken); string html =await resp.Content.ReadAsStringAsync(); Console.WriteLine($"{DateTime.Now}:{html}"); //1.手动取消 //if (cancellationToken.IsCancellationRequested) //{ // Console.WriteLine("任务被取消"); // break; //} //2.抛出异常 //cancellationToken.ThrowIfCancellationRequested(); } } }