【问题标题】:Monitor which thread is downloading url监控哪个线程正在下载url
【发布时间】:2023-06-10 17:15:02
【问题描述】:

我有一个应用程序在不同线程中使用 threadPool 下载 url,但最近我读到一篇文章 (http://www.codeproject.com/KB/IP/Crawler.aspx),它说 HttpWebRequest.GetResponse() 仅在一个线程中工作,而其他线程正在等待那个线程。首先我想知道这是真的吗?我如何监控我的哪个线程实际正在下载它的状态?

【问题讨论】:

    标签: c# .net web-crawler


    【解决方案1】:

    我怀疑 HttpWebRequest.GetResponse 会阻塞其他线程 - 但您可以使用 Fiddler 等工具轻松验证这一点。您可以启动 fiddler 并运行您的程序。一旦您的程序发出请求,该请求就会出现在 Fiddler 中,您可以快速确定它们是同时的还是一个一个的。

    【讨论】:

    • 是的,您对 instcode 答案的评论正是我需要知道的,我正在运行 Fiddler,但我如何确定这一点,因为 fiddler 没有显示在时间实例中正在运行哪个请求
    • 我相信您的下载至少需要几秒钟 - 因此您应该在提琴手中看到多个同时请求,证明并行请求是可能的。在 Fiddler 中,统计选项卡将告诉您请求的开始时间和结束时间,而时间线选项卡可以显示多个请求的组合时间线(由 Fiddler 调用的会话) - 选择多个下载请求并查看时间线选项卡。跨度>
    【解决方案2】:

    是的,GetResponse 是一个阻塞调用(检查 MSDN),它只能在服务器回复或发生请求超时时返回。之后,只需检查状态码并使用 GetResponseStream 开始下载返回的内容。像这样:

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    if (response.StatusCode == 200)
    {
        Stream content = response.GetResponseStream();
        // Read the content and report the downloading progress...
        ...
    }
    

    【讨论】:

    • 我不认为 Ehsan 担心 GetResponse 是否会阻塞当前线程,他担心会阻塞其他线程上的 GetResponse 调用,从而导致无法进行并行下载。