none
一个在Windows 10上会引发断网的.net编程问题(win7无问题) RRS feed

  • 问题

  • 我有一个程序,这个程序会开启多线程去下载某网站图片,每个图片都占用一个线程,下载完毕后线程结束,开启新线程。一般来说至少占用10~100线程左右。

    在以往,这个程序良好运行了多年,直到有一天,这个网站变了。它的图片的header中不再有Content-Length,而是使用了 Transfer-Encoding: chunked。

    于是我的噩梦开始了,原先的操作会造成永久性断网(有线网络),除非重启,否则无论如何都不能再上网(不仅仅是网页,而是所有TCP连接都无法继续,包括网游、IM软件)网络连接显示无网络。这是在1809版上的体现。

    重装成1909的Windows 10后,则永久性断网可以改为间歇性断网后恢复。

    以上行为有以下特征:

    1.高并发下载操作后可能是1分钟以内出现,也可能是数分钟后才出现;但如果保证线程数小于10,则可维持非常长久的时间不出问题。这与下载量无关,仅与并发数有关。

    2.使用腾讯管家的网速保护后可部分缓和症状

    3.在windows 7(sp2)上无论并发数有多高都不会导致断网。(连接到同一个路由器)而且这个bug是在header改变后才出现的。

    4.即使是在win 10中运行的虚拟机(vmware中安装的win10 2004)中进行这个高并发操作,都会导致虚拟机外断网。


    如果有微软工作的朋友,麻烦帮忙转述一下员工,看这是否属于windows 10的BUG?尤其是虚拟机里能让虚拟机外断网这一点足可证明其可怕之处。

    最后,附带上我下载线程中使用的代码(我的程序已修改最大TCP连接数为最大值),平平无奇。

                                    HttpWebRequest request = CreateDownloadRequest(url);
                                    request.Timeout = Timeout;
                                    request.AddRange(0, (int)fileSize - 1);
                                    request.Referer = GetReffer(Server);
                                    byte[] buffer = new byte[8192];
                                    png = new byte[fileSize];
                                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                                    {
                                        using (Stream stream = request.GetResponse().GetResponseStream())
                                        {
                                            int receivedBytes = 0;
                                            for (int readBytes = stream.Read(buffer, 0, buffer.Length); readBytes > 0;)
                                            {
                                                Array.Copy(buffer, 0, png, receivedBytes, readBytes);
                                                receivedBytes += readBytes;
                                                lock (locker)
                                                {
                                                    AcceptedBytes[index] = receivedBytes;
                                                    FinishedBytes += readBytes;
                                                }
                                                readBytes = stream.Read(buffer, 0, buffer.Length);
                                            }
                                        }
                                    }




    2020年7月7日 22:43

答案