您现在的位置是:首页 > 故事汇故事汇

.NET中的异步编程(二)- 传统的异步编程_知识库_暖吧

作者:admin TAG标签: 时间:2019-08-06 19:15:25分类:故事汇阅读:0

简介  在上一篇文章中,我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来讨论我们为什么需要异步编程,异步编程能给我们带来哪些好处。那么知道了好处,我们就开始吧,但是在

  在上一篇文章中,我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来讨论我们为什么需要异步编程,异步编程能给我们带来哪些好处。那么知道了好处,我们就开始吧,但是在异步编程这个方面,说总是比做简单。套用那句不是名言的名言:编写异步程序是困难的,编写可靠的异步程序尤其困难。因为异步程序非常难以编写,而且非常容易出错,很多基本的构造元素在异步编程中都无法使用,这让我们这些开发人员更愿意编写同步的代码,虽然我们知道有些地方真的应该使用异步。

  如何实现异步

  对于很多人来说,异步就是使用后台线程运行耗时的操作。在有些时候这是对的,而在我们日常大部分场景中却不对。

  比如现在我们有这么一个需求:使用HttpWebRequest请求某个指定URI的内容,然后输出在界面上的文本域中。同步代码很容易编写:

private void btnDownload_Click(object sender,EventArgs e)
{
var request
= HttpWebRequest.Create("http://www.sina.com.cn");
var response
= request.GetResponse();
var stream
= response.GetResponseStream();
using(StreamReader reader = new StreamReader(stream))
{
var content
= reader.ReadToEnd();
this.txtContent.Text = content;
}
}

  是吧,很简单。但是正如上一篇文章所说,这个简短的程序体验会非常差。特别是在URI所指向的资源非常大,网络非常慢的情况下,在点击下载按钮到获得结果这段时间界面会假死。

  哦,这个时候你想起了异步。回忆上篇文章的示意图。我们发现只要我们将耗时的操作放到另外一个线程上执行就可以了,这样我们的UI线程可以继续响应用户的操作。

  使用独立的线程实现异步

  如是你写下了下面的代码:

private void btnDownload_Click(object sender,EventArgs e)
{
var downloadThread
= new Thread(Download);
downloadThread.Start();
}

private void Download()
{
var request
= HttpWebRequest.Create("http://www.sina.com.cn");
var response
= request.GetResponse();
var stream
= response.GetResponseStream();
using(StreamReader reader

Tags:

客服在线

服务时间

周一至周日 9:00-21:00