C#异步了解一下

  如何让你的代码在“同一时间”干着两件件事呢?比如说,在初始化加载配置的同时,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

posted @ 2015-06-02 11:55  高效养猪倌  阅读(1122)  评论(10编辑  收藏  举报