怎么在调用异步请求时不阻塞当前线程

在异步编程中,经常会调用已经写好的异步方法。这时会有一个需求:根据异步方法的返回值,做一些别的操作。这时会有两种实现方式:

1. 使用await,阻塞线程,等待异步方法的完成,然后获得返回值,再进行别的操作。示例:

static void Main(string[] args)
        {
            Console.WriteLine("--------------程序运行开始-----------");

            string url = "http://www.baidu.com";

            var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));

            Console.WriteLine("web请求完成,在这里可以处理完成后的业务!");

            Console.WriteLine("--------------程序运行结束-----------");

            Console.Read();
        }

1.1 运行结果:

1.2 很明显这种调用形式,会阻塞线程。所以这样调用也就失去了异步方法的优点。

2. 重新开启一个异步方法,在这个新的异步方法内部,调用需要请求的异步方法。示例:

 1 static void Main(string[] args)
 2         {
 3             Console.WriteLine("--------------程序运行开始-----------");
 4
 5             PostAsync();
 6
 7             Console.WriteLine("--------------程序运行结束-----------");
 8
 9             Console.Read();
10         }
11
12         //异步http请求
13         public async static void PostAsync()
14         {
15             HttpWebResponse httpRes = (HttpWebResponse)await PostData();
16
17             if (httpRes.StatusCode == HttpStatusCode.OK)
18             {
19                 var text = new StreamReader(httpRes.GetResponseStream()).ReadToEnd();
20
21                 Console.WriteLine("web请求完成,在这里可以处理完成后的业务!");
22             }
23         }
24
25         public async static Task<WebResponse> PostData()
26         {
27             string url = "http://www.baidu.com";
28
29             var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
30
31             return await httpReq.GetResponseAsync();
32         }

2.1 运行结果:

2.2 很明显,这种调用方式才发挥了异步方法的作用。即不会阻塞当前线程的执行。

时间: 2024-11-08 13:12:48

怎么在调用异步请求时不阻塞当前线程的相关文章

Java调用其他程序时waitFor()阻塞

Java调用其他程序时waitFor()阻塞  http://www.cnblogs.com/yejg1212/archive/2013/06/02/3114242.html

关于异步请求时出现的问题

第一个问题: 在struts2的配置文件中  如果不指定type的类型 那么在action中任何跳转都是默认forword类型的  称为内部跳转  比如下面的例子 第一个例子: 管理员登录成功之后  跳转到list.jsp页面 但是网页上的url却是下面的 第二个例子: 用户登录成功之后  跳转到detail.jsp页面 但是url 说了这么多   就是为了解决上面的操作和异步请求时   容易出现的问题 继续拿第二个例子来说明  如果在该详情页面中  我使用异步操作(比如做更新) 只要我们使用了

【CompletableFuture】CompletableFuture测试runAsync()方法调用CompletableFuture.join()/get()方法阻塞主线程

问题 CompletableFuture.runAsync() 返回 CompletableFuture<Void>对象,调用CompletableFuture.allOf(f1,f2).join() 是否能够阻塞主线程 结论 public static void main(String[] args) { CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> { try { Thread.sleep(20

IOS之同步请求、异步请求、GET请求、POST请求

原链接在此:http://blog.csdn.net/liulala16/article/details/8271673 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3.GET请求,将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节: 4.POST请求,将参数放到bod

iOS开发-Get请求,Post请求,同步请求和异步请求

标题中的Get和Post是请求的两种方式,同步和异步属于实现的方法,Get方式有同步和异步两种方法,Post同理也有两种.稍微有点Web知识的,对Get和Post应该不会陌生,常说的请求处理响应,基本上请求的是都是这两个哥们,Http最开始定义的与服务器交互的方式有八种,不过随着时间的进化,现在基本上使用的只剩下这两种,有兴趣的可以参考本人之前的博客Http协议中Get和Post的浅谈,iOS客户端需要和服务端打交道,Get和Post是跑不了的,本文中包含iOS代码和少量Java服务端代码,开始

IOS之同步请求、异步请求、GET请求、POST请求(整理复习))

1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3.GET请求,将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节: 4.POST请求,将参数放到body里面.POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获. 1.     同

IOS - IOS之同步请求、异步请求、GET请求、POST请求(转载)

转载:http://www.open-open.com/lib/view/open1355055986679.html 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3.GET请求,将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节: 4.POST请求,将参数放到body

IOS之同步请求、异步请求、GET请求、POST请求(转)

1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3.GET请求,将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节: 4.POST请求,将参数放到body里面.POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获. 001 1.  

Objective-C 之同步请求、异步请求、GET请求、POST请求

本篇文章由:http://www.sollyu.com/objective-c-synchronization-requests-requests-for-asynchronous-requests-get-and-post-requests/ 说明 1 同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2 异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3 GET