在使用HttpClient做客户端调用一个API时 模拟并发调用时发生“死锁"?
平时还是比较喜欢看书的。。但有时候遇到问题还是经常感到脑袋一蒙。。智商果然是硬伤。。
同事发现了个问题,代码如下:
class Program
{
static void Main(string[] args)
{
HttpClientClass c = new HttpClientClass();
while (true)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "开始请求:" + DateTime.Now);
c.BeginGetMethod();
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
System.Threading.Thread.Sleep( * );
}
}
}
public class HttpClientClass
{
private static readonly HttpClient c;
static HttpClientClass()
{
c = new HttpClient();
c.Timeout = TimeSpan.FromSeconds();
}
public void BeginGetMethod()
{
try
{
var r = c.GetAsync("https://www.cnblogs.com/").Result;
if (r.IsSuccessStatusCode)
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "ok");
else
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "bad request");
}
catch (Exception ex)
{
Console.WriteLine(ex.GetType().FullName);
}
}
在使用HttpClient的GetAsync请求后阻塞查询.Result“死锁了”,我们知道GetAsync内部也是一个后台线程在执行,直到获取到结果时会调用Task中的SetResult方法,然后通过.Result就能回去结果了。。
如果此处有问题,那我们假如做网站开发时,并发请求来了岂不是废掉了?!!
当然不是这样。。实际上线程池中处理任务时是存在任务队列的(不提看源码的事。。看完就忘。。)此处大概意思就是:主线程创建线程任务时,任务优先级高于后台线程创建的线程。这里的while不停的创建后台任务就导致了GetAsync方法中的后台任务一直在等啊等。。所以就发生了所谓的"死锁"。。其实是根本就没机会执行。。(没涉及到线程上下文切换,所以谈到这也能发生死锁时脑袋一蒙。。)
所以可以这么调用:
Task.Factory.StartNew(() =>
{
while (true)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "开始请求:" + DateTime.Now);
c.BeginGetMethod();
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
System.Threading.Thread.Sleep( * );
}
});
在使用HttpClient做客户端调用一个API时 模拟并发调用时发生“死锁"?的更多相关文章
- WebApi系列~通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...
- 通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)
原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...
- 通过.NET客户端调用Web API(C#)
3.2 Calling a Web API From a .NET Client (C#) 3.2 通过.NET客户端调用Web API(C#) 本文引自:http://www.asp.net/web ...
- Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...
- 通过.NET客户端异步调用Web API(C#)
在学习Web API的基础课程 Calling a Web API From a .NET Client (C#) 中,作者介绍了如何客户端调用WEB API,并给了示例代码. 但是,那些代码并不是非 ...
- 从零开始调用一个手机号归属地查询API
自从过上程序员的生活,身边总是或多或少的提及一些API(应用程序接口),网上各种入门教程.实例大把大把,有的只是贴上部分代码,也不给注释, 写Demo的时候连编译都无法通过.下面我从小白开始来介绍下调 ...
- Orchard Core 增加了一个API模块,要怎么调用
如下,我在Orchard Core框架中添加了一个API的模块,并且定义了对应的权限才可以调用,那么我们现在考虑的就是要怎么去调用它. 首先,我们用Fiddler查看下我们正常的登录的http报文,直 ...
随机推荐
- Android Bug BaseExpandableListAdapter, getChildView
@Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastC ...
- jQuery查找标签--选择器,筛选器,模态对话框, 左侧菜单栏
查找标签 选择器: 基本选择器(同css) id选择器 $("#id") 标签选择器 $('tagName') class选择器 $(".className") ...
- 【文文殿下】CF1029F Multicolored Markers
这道题考场上卡了文文相当长的时间,所以写个题解泄泄愤QAQ 题意:给你$a$块红瓷砖,$b$块白瓷砖,在一个无限大的地上拼装,要求整体是一个矩形,并且至少有一种颜色是一个矩形,求最小周长. 题解: 首 ...
- jquery源码解析:attr,prop,attrHooks,propHooks详解
我们先来看一下jQuery中有多少个方法是用来操作元素属性的. 首先,看一下实例方法: 然后,看下静态方法(工具方法): 静态方法是内部使用的,我们外面使用的很少,实例方法才是对外的. 接下来,我们来 ...
- Win10桌面图标无法拖动
1.右键桌面>查看>取消自动排列 2.桌面多按几次Esc 3.gpedit.msc “用户配置/管理模板/Windows组件/任务计划程序/禁止拖放>改为未配置
- 逻辑卷磁盘管理和dd命令
底层PV 中层VG 上层LV PE(phsical extent):在逻辑层次上,VG把PV分成固定大小的块,这些块就叫PE,默认为4M ,创建LV的过程就是分多少个PE的过程. 自动分区的过 ...
- python:利用smtplib模块发送邮件详解
自动化测试中,测试报告一般都需要发送给相关的人员,比较有效的一个方法是每次执行完测试用例后,将测试报告(HTML.截图.附件)通过邮件方式发送. 首先我们要做: 进入163邮箱,点击设置中的pop3/ ...
- C#-WebForm-组合查询(Queryable延迟查询、Intersect交集)、分页展示基础
组合查询: 方法一:Queryable<> 延迟查询 其特点是:读到词句代码时不会立即执行,而是在进行数据绑定时执行 优点:此期间可以进行添加查询条件,以减少数据库查询内容,来减少内存占用 ...
- pycharm连接数据库出现时区jdbc问题
unrecognized or represents more than one time zone. You must configure either the server or JDBC dri ...
- 南昌网络赛 Distance on the tree 主席树+树剖 (给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数。)
https://nanti.jisuanke.com/t/38229 题目: 给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数. #include <bits/stdc++.h ...