C#异步编程

在异步编程前,先举个没有异步的示例:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Diagnostics;//
 7 using System.Net;//
 8
 9 namespace ConsoleApplication6
10 {
11     class MyDownloadString
12     {
13         Stopwatch sw = new Stopwatch();//
14
15         public void DoRun()
16         {
17             const int LargeNumber = 6000000;
18             sw.Start();
19
20             int t1 = CountCharacters(1, "http://www.cnblogs.com");
21             int t2 = CountCharacters(2, "http://www.163.com");
22
23             CountToALargeNumber(1, LargeNumber);
24             CountToALargeNumber(2, LargeNumber);
25             CountToALargeNumber(3, LargeNumber);
26             CountToALargeNumber(4, LargeNumber);
27
28             Console.WriteLine("Chars in http://www.microsoft.com          :{0}", t1);
29             Console.WriteLine("Chars in http://www.illustratedcsharp.com  :{0}", t2);
30         }
31
32         private int CountCharacters(int id, string uriString)
33         {
34             WebClient wc1 = new WebClient();
35
36             Console.WriteLine("Starting call {0}    :    {1, 4:N0} ms", id, sw.Elapsed.TotalMilliseconds);//开始下载网页时间
37             string result = wc1.DownloadString(new Uri(uriString));//正式下载网页数据
38             Console.WriteLine("Call {0} completed   :    {1, 4:N0} ms", id, sw.Elapsed.TotalMilliseconds);//完成网页下载
39             //Console.WriteLine(result);
40             return result.Length;
41         }
42
43         private void CountToALargeNumber(int id, int value)
44         {
45             for (long i = 0; i < value; i++) ;
46
47             Console.WriteLine("End counting {0}     :   {1, 4:N0} ms", id, sw.Elapsed.TotalMilliseconds);//一个循环结束时间,目的是延时
48
49         }
50     }
51     class Program
52     {
53         static void Main(string[] args)
54         {
55             MyDownloadString ds = new MyDownloadString();
56             ds.DoRun();
57             Console.ReadKey();
58         }
59
60     }
61 }
62 //output:
63 //------------------------------------------------------------------------
64 //Starting call 1    :       1 ms
65 //Call 1 completed:        207 ms
66 //Starting call 2    :     207 ms
67 //Call 2 completed:        382 ms
68 //End counting 1  :    424 ms
69 //End counting 2  :    447 ms
70 //End counting 3  :    469 ms
71 //End counting 4  :    491 ms
72 //Chars in http://www.microsoft.com          :41177
73 //Chars in http://www.illustratedcsharp.com  :6870

异步

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;//
using System.Net;//

namespace ConsoleApplication1
{
    class MyDownloadString
    {
        Stopwatch sw = new Stopwatch();
        public void DoRun()
        {
            const int LargeNumber = 6000000;
            sw.Start();

            Task<int> t1 = CountCharactersAsync(1, "http://www.163.com");
            Task<int> t2 = CountCharactersAsync(2, "http://www.qq.com");

            CountToALargeNumber(1, LargeNumber);
            CountToALargeNumber(2, LargeNumber);
            CountToALargeNumber(3, LargeNumber);
            CountToALargeNumber(4, LargeNumber);

            Console.WriteLine("Chars in http://www.164.com   :  {0}", t1.Result);
            Console.WriteLine("Chars in http://www.qq.com    :  {0}", t2.Result);
        }

        private async Task<int> CountCharactersAsync(int id, string site)
        {
            WebClient wc = new WebClient();
            Console.WriteLine("String call {0}  :  {1,4:N0} ms", id, sw.Elapsed.TotalMilliseconds);
            string result1 = await wc.DownloadStringTaskAsync(new Uri(site));
            Console.WriteLine("Call  {0} completed :  {1, 4:N0} ms", id, sw.Elapsed.TotalMilliseconds);
            return result1.Length;
        }

        private void CountToALargeNumber(int id, int value)
        {
            for (long i = 0; i < value; i++) ;
            Console.WriteLine("End counting {0}  : {1, 4:N0} ms", id, sw.Elapsed.TotalMilliseconds);

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDownloadString ds = new MyDownloadString();
            ds.DoRun();
            Console.ReadKey();
        }
    }
}
/*
String call 1  :     2 ms
String call 2  :   160 ms
End counting 1  :  261 ms
End counting 2  :  283 ms
End counting 3  :  309 ms
End counting 4  :  334 ms
Call  1 completed :   353 ms
Chars in http://www.164.com   :  6870
Call  2 completed :   954 ms
Chars in http://www.qq.com    :  599258
---------------------------------------------------------------------
Starting call 1    :       1 ms
Call 1 completed   :     255 ms
Starting call 2    :     255 ms
Call 2 completed   :     751 ms
End counting 1     :    785 ms
End counting 2     :    808 ms
End counting 3     :    830 ms
End counting 4     :    852 ms
Chars in http://www.microsoft.com          :6870
Chars in http://www.illustratedcsharp.com  :599274

*/
时间: 2024-12-10 21:07:52

C#异步编程的相关文章

Python Twisted网络编程框架与异步编程入门教程

原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 感 谢:感谢 杨晓伟 luocheng likebeta 为国内Twisted Coder做的里程碑级贡献 其 它:能访问到Github的童鞋,请访问出处链接.因为出处排版相当棒! 1.Twisted理论基础 2.异步编程初探与reactor模式 3.初次认识Twisted 4.由twisted支持

利用 Python yield 创建协程将异步编程同步化

在 Lua 和 Python 等脚本语言中,经常提到一个概念: 协程.也经常会有同学对协程的概念及其作用比较疑惑,本文今天就来探讨下协程的前世今生. 首先回答一个大家最关心的问题:协程的好处是什么? 通俗易懂的回答: 让原来要使用 异步 + 回调 方式写的非人类代码,可以用看似同步的方式写出来. 1.回顾同步与异步编程 同步编程即线性化编程,代码按照既定顺序执行,上一条语句执行完才会执行下一条,否则就一直等在那里. 但是许多实际操作都是CPU 密集型任务和 IO 密集型任务,比如网络请求,此时不

探索Javascript 异步编程

在我们日常编码中,需要异步的场景很多,比如读取文件内容.获取远程数据.发送数据到服务端等.因为浏览器环境里Javascript是单线程的,所以异步编程在前端领域尤为重要. 异步的概念 所谓异步,是指当一个过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的过程在完成后,通过状态.通知或者回调来通知调用者. 比如我们写这篇文字时点击发布按钮,我们并不能马上得到文章发布成功或者失败.等待服务器处理,这段时间我们可以做其他的事情,当服务器处理完成后,通知我们是否发布成功. 所谓同步,是指当一个过

JavaScript异步编程

在一年前初学js的时候,看过很多关于异步编程的讲解.但是由于实践经验少,没有办法理解的太多,太理论的东西也往往是看完就忘. 经过公司的三两个项目的锻炼,终于对js异步编程有了比较具体的理解.但始终入门较浅,在这里就当是给自己一个阶段性的总结. 在异步编程中,一条语句的执行不能依赖上一条语句执行完毕的结果,因为无法预测一条语句什么时候执行完毕,它与代码顺序无关,语句是并发执行的. 例如以下代码:     1 $.get($C.apiPath+'ucenter/padCharge/findMembe

【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 二.同步代码存在的问题 对于同步的代码,大家肯定都不陌生,因为我们平常写的代码大部分都是同步的,然而同步代码却存在一个很严重的问题,例如我们向一个Web服务器发出一个

让我们再为C#异步编程Async正名

本文版权归博客园和作者吴双本人共同所有.转载和爬虫必须在显要位置注明出处:http://www.cnblogs.com/tdws 半年前翻译了一系列很糟糕的异步编程文章,用异步的常用语来说:"在将来的某个时间" 我还会重新翻译Async in C#5.0 http://www.cnblogs.com/tdws/p/5617242.html 写在前面 异步编程在处理并发方面被使用的越来越多,之所以说上面一句话,是为了区分多线程编程.各位司机都知道,实际上异步编程的核心目标正并发处理.可还

异步编程系列第04章 编写Async方法

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

Javascript异步编程的4种方法

转自 阮一峰 http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 作者: 阮一峰 日期: 2012年12月21日 你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境

C#基础___异步编程

C#异步编程_0 三种常见模式:1.async/await    2.Background类    3.BeginInvoke/EndInvoke 一.async/await 代码示例: class Program { static void Main() { Task<int> value = DoAsyncStuff.Handing(5, 6); } } static class DoAsyncStuff { public static async Task<int> Hand