本文选之一个人博客,很实用的经验之谈,建站学为你奉献,希望实际应用中对你有帮助。 几个月前做的一个软件里想添加一个天气预报功能, 也就是利用了一下Google Weather的接口: http://www.google.com/ig/api?hl=zh-cn&weather=某某市,某某省 , 效果也达到了. 不忘书中所讲: 耗时操作, 且非计算密集型任务, 最好使用异步方法. 根据Anders Hejlsberg的视频中演示的那样, 我写出下面一段代码, 也是很多人拿来演示异步的经典写法:
就是这样的一个所谓异步的方法, 运行一下, 最短的时候花了3秒多才获取到了weatherString, 很多时候甚至花了10秒多. 我就眼巴巴的看着程序在假死(Not Responding), 一边看着我的代码, 我不是异步了么? 异步不是就是为了避免程序假死的么? 目前来看程序似乎并没有异步. 于是开始找原因...也请教了不少人...也得到了一些可能的原因:
事实上我Ping了google.com之后, 把google.com换成IP地址, 运行程序, 并没有发现有什么效果...
但把GetResponseStream改成BeginGetResponseStream之后, 也没有任何改观.
想一想这些应该都是在高速缓存上进行的, 不至于要花3秒, 10多秒吧? 这个问题还真不太好描述, 事实上后来做了一系列的测试, 测试发现只有第一次发出WebRequest看似不是异步的. 接下来继续尝试几次发出WebRequest, 到获得Response的时间就非常非常短. 为了找出究竟在哪个环节耗时比较厉害, 我写了一个控制台程序来测试, 测试中我用了一个for循环, 连续发出5次同样的WebRequest, 测试结果如下: 可以发现程序在第一次初始化WebRequest和第一次从发出请求到获得响应消耗的时间最多! 昨天发现原来是代理(Proxy)的问题! MSDN中关于HttpWebRequest.Proxy属性是这样描述的:
回到遇到的问题, 程序并没有指定代理, 第一次运行的时候, 程序会寻找IE中的代理, 如果没有找到才会去直接访问服务器, 这中间花费了不少时间. 要解决这个问题, 请在代码中加上这么一行: xxRequest.Proxy =
null ; |