c#复习笔记-异步方法
同步是操作完成以后再返回给调用者,异步大部分工作是返回给调用者以后完成的。编写异步函数,可以将返回值类型有Void改为Task。这样方法就可以异步调用,可以等待的,其他方面不需要修改。如:
1 2 3 4 5 6 | public async Task Print() { await Task.Delay(100); var number = 20 * 20; Console.WriteLine(number); } |
1、Task<T>,返回一个T类型的值,异步方法的返回值必须是TasK<T>,从Task的Result获取T的返回值。
1 2 3 4 5 6 7 | public static Task< int > AddAsync( int n, int m) { return Task.Run(() => { return n + m; }); } //调用 var t = Calculator.AddAsync(1, 2); //有返回值 Console.WriteLine($ "Result:{t.Result}" ); |
2、Task,调用方法不需要从异步方法中取返回值,但是希望检查异步方法的状态,那么可以选择可以返回 Task 类型的对象。
1 2 3 4 5 6 7 8 | public static async Task AddAsync( int n, int m, int t) { var value = await Task.Run(() => { return n + m + t; }); Console.WriteLine($ "{n}+{m}+{t}={value}" ); } Task t2 = Calculator.AddAsync(1, 2, 3); await Calculator.AddAsync(1, 2, 3); Console.WriteLine( "执行完毕!" ); |
3、Void,调用异步方法,但需要进一步的交互。
1 2 3 4 5 6 7 8 9 10 11 12 | public class WriteToText { public static async void WriteHtml() { using (HttpClient client = new HttpClient()) { string htmlString = await client.GetStringAsync( "https://cn.bing.com/" ); await File.WriteAllTextAsync( "D:\\writeHtml.txt" , htmlString); Console.WriteLine( "写入完毕!" ); } } } |
4、取消异步请求
CancellationToken 对象包含任务是否被取消的信息;如果该对象的属性 IsCancellationRequested 为 true,任务需停止操作并返回。
CancellationTokenSource 可创建 CancellationToken 对象,调用 CancellationTokenSource 对象的 Cancel 方法,会使该对象的 CancellationToken 属性 IsCancellationRequested 设置为 true。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static async Task WriteHtml(CancellationToken token) { using (HttpClient client = new HttpClient()) { string htmlString = await client.GetStringAsync( "https://cn.bing.com/" ); await File.WriteAllTextAsync( "D:\\writeHtml.txt" , htmlString); if (token.IsCancellationRequested) { //执行取消操作 Console.WriteLine( "异步操作已取消!" ); return ; } Console.WriteLine( "写入完毕!" ); } } CancellationTokenSource cts = new CancellationTokenSource(); var token=cts.Token; Task t= WriteToText.WriteHtml(token); Thread.Sleep(1000); //超过1秒钟没执行完则取消操作 cts.Cancel(); t.Wait(); |
5、Task.Delay(),暂停执行
Task.Delay() 方法会创建一个 Task 对象,该对象将暂停其在线程中的处理,并在一定时间之后完成。Task.Delay是 Thread.Sleep 的异步版本,它不会阻塞线程,意味着线程可以继续处理其它工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static async Task WriteHtml() { using (HttpClient client = new HttpClient()) { int count = 0; while ( true ) { string htmlString = await client.GetStringAsync( "https://cn.bing.com/" ); await File.AppendAllTextAsync( "D:\\writeHtml.txt" , htmlString); Console.WriteLine($ "写入完毕!{count++}" ); await Task.Delay(2000); //每2秒中循环一次 } } } await WriteToText.WriteHtml(); |
从别后, 忆相逢, 几会魂梦与汝同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」