首页 > 代码库 > 怎么在调用异步请求时不阻塞当前线程
怎么在调用异步请求时不阻塞当前线程
在异步编程中,经常会调用已经写好的异步方法。这时会有一个需求:根据异步方法的返回值,做一些别的操作。这时会有两种实现方式:
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 很明显,这种调用方式才发挥了异步方法的作用。即不会阻塞当前线程的执行。
怎么在调用异步请求时不阻塞当前线程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。