平常還是较为喜爱看书的。。但有时碰到难题還是常常感到脑壳一蒙。。智商果真是硬伤。。

朋友发觉了个难题,编码以下:

    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(10 * 1);
            }
        }
    }
    public class HttpClientClass
    {
        private static readonly HttpClient c;
        static HttpClientClass()
        {
            c = new HttpClient();
            c.Timeout = TimeSpan.FromSeconds(15);
        }
        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(10 * 1);
                }
            });