首页 > 代码库 > await和async关键字来写异步程序
await和async关键字来写异步程序
await和async关键字出现于.Net5.0,方便写异步程序。
例子:
public class MyClass { public MyClass() { DisplayValue(); //这里不会阻塞 System.Diagnostics.Debug.WriteLine("MyClass() End."); } public Task<double> GetValueAsync(double num1, double num2) { return Task.Run(() => { for (int i = 0; i < 1000000; i++) { num1 = num1 / num2; } return num1; }); } public async void DisplayValue() { double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回 //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用 System.Diagnostics.Debug.WriteLine("Value is : " + result); } }
要执行异步操作的方法用async标记,调用方法时用await标记,被异步调用的方法返回值用<task>修饰。
实际执行代码:
public void DisplayValue() { System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter(); awaiter.OnCompleted(() => { double result = awaiter.GetResult(); System.Diagnostics.Debug.WriteLine("Value is : " + result); }); }
以下为某大神写的静态类,可以将一般方法转化为异步调用:
public static class TaskAsyncHelper 02.{ 03. /// <summary> 04. /// 将一个方法function异步运行,在执行完毕时执行回调callback 05. /// </summary> 06. /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param> 07. /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param> 08. public static async void RunAsync(Action function, Action callback) 09. { 10. Func<System.Threading.Tasks.Task> taskFunc = () => 11. { 12. return System.Threading.Tasks.Task.Run(() => 13. { 14. function(); 15. }); 16. }; 17. await taskFunc(); 18. if (callback != null) 19. callback(); 20. } 21. 22. /// <summary> 23. /// 将一个方法function异步运行,在执行完毕时执行回调callback 24. /// </summary> 25. /// <typeparam name="TResult">异步方法的返回类型</typeparam> 26. /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param> 27. /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param> 28. public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback) 29. { 30. Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=> 31. { 32. return System.Threading.Tasks.Task.Run(()=> 33. { 34. return function(); 35. }); 36. }; 37. TResult rlt = await taskFunc(); 38. if(callback != null) 39. callback(rlt); 40. } 41.}
await和async关键字来写异步程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。