端游游戏开发

async & await 异步编程的一点巧方法

时间:2017-6-18 8:25:20  作者:06评比  来源:06评比  查看:9900  评论:0
内容摘要:await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程。 await关键字会阻塞/暂停调用它的方法,也即下面的 Phycology 方法.当阻塞其调用方法的时候,...
await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程。

 

await关键字会阻塞/暂停调用它的方法,也即下面的 Phycology 方法.当阻塞其调用方法的时候,程序会回到UI线程中去执行,也就是main方法中去执行,这点可以通过

C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 其内的程序来判断.

 

async & await 组合的程序片段一定要注意使用,在此列举几个注意事项,也可以说是优化事项。我将其放到了代码的注释部分,这样更方便你理解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/// <summary>
        /// ....各类书籍推荐...
        ///
        /// 应当在此处呈现await的返回值...
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //第一类书籍:心理学....
            var book = new List<book>()
            {
                new book() { book_classify = "心理学", book_name = "每一种孤独都有陪伴" },
                new book() { book_classify = "心理学", book_name = "愿你拥有被爱照亮的生命" },
                new book() { book_classify = "心理学", book_name = "感谢自己的不完美" },
                new book() { book_classify = "编程语言", book_name = "编写高质量代码 改善C#程序的157个建议" },
                new book() { book_classify = "编程语言", book_name = "python cookbook" },
                new book() { book_classify = "编程语言", book_name = "设计模式(C#版)" }
            };
 
            //var test = book.Where(p => p.book_classify == "心理学").Select(p => p.book_name);
 
            //foreach(var i in test)
            //{
            //    Console.WriteLine(i);
            //}
 
            var task = handle(book);
 
 
            Console.WriteLine(task.Result);
 
        }
 
        /// <summary>
        /// Attention:
        /// 在这里取出我们通过Task任务放到线程池中处理并返回的数据,同时注意
        /// 除了传递异步调用方法(这里是 Phycology方法)之外,因为可能需要做其他的操作,
        /// 我们可以将await关键字放在异步调用方法返回的变量处,而不是直接使用await关键字去等待调用方法
        /// 这样设计充分利用了时间,提高了效率...
        /// </summary>
        /// <param name="book"></param>
        /// <returns></returns>
        public static async Task<string> handle(List<book> book)
        {
            var _physchology = Phycology(book);
 
            var _programmer = Programmer(book);
 
            ///在这里做一些其他的操作...
            ///以充分利用时间
 
            return await _physchology + await _programmer;
 
        }
 
 
        /// <summary>
        /// Attention:
        /// 应当将需要的数据返回到调用方法处...
        /// 在这里是  sb
        /// </summary>
        /// <param name="book"></param>
        /// <returns></returns>
        public static async Task<string> Programmer(List<book> book)
        {
            StringBuilder sb = new StringBuilder();
 
            return await Task.Run(() =>
            {
                var programmer = book.Where(p => p.book_classify == "编程语言").Select(p => p.book_name).ToList();
 
                foreach(var in programmer)
                {
                    sb.Append(i + "\r\n");
                }
 
                return sb.ToString();
            });
 
        }
 
        public static async Task<string> Phycology(List<book> book)
        {
            StringBuilder sb = new StringBuilder();
            return await Task.Run(() =>
            {
 
                var _phychology = book.Where(p => p.book_classify == "心理学").Select(p => p.book_name).ToList();
 
                foreach(var in _phychology)
                {
                    sb.Append(i + "\r\n");
                }
 
                return sb.ToString();
            });
        }
 
    }

最后的实现:

async_&_await_异步编程的一点巧方法  

标签:async&await异步编程的一点巧方法 
相关文章

    本站评比的所有娱乐站点,均为世界最权威专业的网站 

    06评比专为广大博友提供服务好、信誉高、种类多的娱乐网站 

    邮箱:1004003180@qq.com   合作广告请联系! 

    Copyright © 2006-2021  06评比,你身边的线上娱乐评比担保机构  All Rights Reserved