标签:
如何让你的代码在“同一时间”干着两件件事呢?比如说,在初始化加载配置的同时,UI界面能够响应用户的各种点击事件。而不置于卡死,特别是出现如下面这种情况的时候,对于用户来说是很崩溃的。
那么我们得用什么技术来避免这种问题呢?是的,异步编程。(当然引发程序卡死,不一定是没有用异步,也可能程序本身就有异常)
假设现在你正在吃着早饭,在吃的同时你又想玩游戏,现在我们用代码来实现这个问题。
首先创建一个吃饭的方法
1 async static Task<string> EatAsync() 2 { 3 Console.WriteLine("把饭放到嘴里"); 4 //这是一个很耗时的操作 5 var result = await Task.Run<string>(() => 6 { 7 for (int i = 0; i < 5; i++) 8 { 9 Thread.Sleep(500); 10 Console.WriteLine("嚼了{0}下", i); 11 } 12 return "把饭咽下去"; 13 }); 14 return result; 15 }
在上面的代码中,我们看到:异步方法需要一个async修饰符;异步方法最好统一以“Async”作为后缀结尾。
对于异步方法的返回值有以下几种类型:
如果你的方法有操作数为 TResult 类型的返回语句,则为 Task。
如果你的方法没有返回语句或具有没有操作数的返回语句,则为 Task。
如果你编写的是异步事件处理程序,则为 Void。
下面是玩游戏的方法(当然这只是个简单的方法)
1 //这个方法你也可以用写成异步方法 2 static void PlayGame() 3 { 4 for (int i = 0; i < 10; i++) 5 { 6 Thread.Sleep(200); 7 Console.WriteLine("超级玛丽奔跑中..."); 8 } 9 }
一个简单吃早饭的函数
1 async static void BreakfastTimeAsync() 2 { 3 //返回一个string类型的结果 4 Task<string> temp = EatAsync(); 5 6 //在这里做一些与吃饭不相关的事 7 PlayGame(); 8 9 //等待temp任务的完成 10 var result = await temp; 11 12 //对最终的结果做一些处理 13 Console.WriteLine(result); 14 }
在异步方法中方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控件返回到方法的调用方。
最后来看下运行结果
最后流年建议大家在吃饭的时候不要做别的事情,这是很危险的
https://msdn.microsoft.com/zh-cn/library/hh191443.aspx
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task%28v=vs.110%29.aspx
标签:
原文地址:http://www.cnblogs.com/liunlls/p/async.html