zoukankan      html  css  js  c++  java
  • 基于任务的异步模式(TAP)

    Task

    .net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。

    1,Task.Factory.StartNew,比较常用。

    2,Task.Run,是.net 4.5中增加的。

    3,Task.FromResult,如果结果是已计算,就可以使用这种方法来创建任务。

    下面就以Task.Factory.StartNew继续来实现前面的那个例子,代码如下。

      1 /// <summary>
      2         /// 使用Task,Task.Factory.StartNew,会创建新的线程
      3         /// </summary>
      4         /// <param name="sender"></param>
      5         /// <param name="e"></param>
      6         private void button4_Click(object sender, EventArgs e)
      7         {
      8             this.richTextBox1.Text = "正在处理请求...";
      9 
     10             Task.Factory.StartNew(() =>
     11             {
     12                 //下面这段代码可封装一下,一个没有返回值的方法
     13                 var url = this.textBox1.Text.Trim();
     14                 var request = HttpWebRequest.Create(url);
     15                 var response = request.GetResponse();
     16                 var stream = response.GetResponseStream();
     17                 using (StreamReader reader = new StreamReader(stream))
     18                 {
     19                     var content = reader.ReadToEnd();
     20                     this.richTextBox1.Text = content;
     21                 }
     22             });
     23         }
    View Code

    Task相较ThreadPool线程池使用更简单,而且支持线程的取消,完成和失败通知等交互性操作,而这些是ThreadPool所没有的。并且Task是可以有返回值的。

    async/await

    async&await是.net 4.5新增的特性,

    下面还是使用async&await实现一遍之前的例子,代码如下。

      1 /// <summary>
      2         /// 使用async/await
      3         /// </summary>
      4         /// <param name="sender"></param>
      5         /// <param name="e"></param>
      6         private async void button5_Click(object sender, EventArgs e)
      7         {
      8             this.richTextBox1.Text = "正在处理请求...";
      9 
     10             await DoWorkAsync();
     11         }
     12 
     13         public async Task DoWorkAsync()
     14         {
     15             var url = this.textBox1.Text.Trim();
     16             var request = HttpWebRequest.Create(url);
     17             var response = request.GetResponse();
     18             var stream = response.GetResponseStream();
     19             using (StreamReader reader = new StreamReader(stream))
     20             {
     21                 var content = reader.ReadToEnd();
     22                 this.richTextBox1.Text = content;
     23             }
     24         }
    View Code

    有以下疑问:

    1,看起来使用了async,UI线程还是会阻塞?

    2,使用async并没有创建一个新的线程?

  • 相关阅读:
    Ubuntu 18.04 上使用xrdp远程桌面登录蓝屏解决
    给定几个字母,输出所有可能的组合(使用递归解决)
    docker容器启动参数
    群辉6.1.7安装scrapy框架执行爬虫
    python爬虫在解析不带引号的json报错的问题解决方案
    python的datetime常用方法
    Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.
    Django admin argument to reversed() must be a sequence
    linux(乌班图)下执行pip没有问题,执行sudo pip报错的问题
    Robot Framework 关键字操作实例
  • 原文地址:https://www.cnblogs.com/mcgrady/p/5661150.html
Copyright © 2011-2022 走看看