平时还是比较喜欢看书的。。但有时候遇到问题还是经常感到脑袋一蒙。。智商果然是硬伤。。

同事发现了个问题,代码如下:

    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时 模拟并发调用时发生“死锁"?的更多相关文章

  1. WebApi系列~通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  2. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

    回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...

  3. 通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  4. 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)

    原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...

  5. 通过.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 ...

  6. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

    1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...

  7. 通过.NET客户端异步调用Web API(C#)

    在学习Web API的基础课程 Calling a Web API From a .NET Client (C#) 中,作者介绍了如何客户端调用WEB API,并给了示例代码. 但是,那些代码并不是非 ...

  8. 从零开始调用一个手机号归属地查询API

    自从过上程序员的生活,身边总是或多或少的提及一些API(应用程序接口),网上各种入门教程.实例大把大把,有的只是贴上部分代码,也不给注释, 写Demo的时候连编译都无法通过.下面我从小白开始来介绍下调 ...

  9. Orchard Core 增加了一个API模块,要怎么调用

    如下,我在Orchard Core框架中添加了一个API的模块,并且定义了对应的权限才可以调用,那么我们现在考虑的就是要怎么去调用它. 首先,我们用Fiddler查看下我们正常的登录的http报文,直 ...

随机推荐

  1. WPF 使用OCX控件速度很慢

    最近公司项目,需要在wpf上面嵌入ocx控件,但是程序运行起来后,进行操作后,界面一直很卡,找了各种原因,没有找到原因,后来直接运行exe文件,速度顿时快了很多.

  2. 375. 猜数字大小 II leetcode java

    题目: 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x 并且猜错 ...

  3. 九、基础正则表达式BRE

    1.重要性:简单的说正则表达式就是处理一套字符串的规则和方法,以行为单位对字符串进行处理. 运维工作中,会有大量的访问日志,错误日志,大数据学习正则表达式是不可少的. 2.linux正则表达式,主要是 ...

  4. [ActionScript 3.0] 模拟win7彩色气泡屏保效果

    主文件: package { import com.views.BubbleView; import com.views.ColorfulBubble; import flash.display.Sp ...

  5. [Swift实际操作]八、实用进阶-(2)Swift语言中的三种消息传递模式

    本文将通过响应按钮的点击事件,来演示Target-Action消息传递机制,该机制主要用于响应用户的界面操作.打开创建的空白项目.然后在左侧的项目导航区,打开视图控制器的代码文件:ViewContro ...

  6. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

  7. Swagger2使用记录

    1. Swagger2使用记录 1.1. Bean配置文件 @Configuration public class Swagger2 { @Bean public Docket createRestA ...

  8. 调用ajax的返回值,需要再ajax之外的函数体里return,以及同步异步问题

    <html> <head> <meta charset="utf-8"/> <script src="js/jquery-1.1 ...

  9. 关于npm run dev报错npm ERR! missing script: dev

    出现这个问题应当重新使用 vue init webpack 来初始化工程. 在执行 npm run dev 就可以执行了.

  10. Android之build.prop属性详解

    注:本篇文章是基于MSD648项目(AndroidTV)的prop进行说明. Android版本:4.4.4 内核版本:3.10.86 1.生成build.prop build.prop的生成是由ma ...