【问题标题】:Would this Asynchronous download work? WebClient.DownloadDataAsyn() problem这种异步下载会起作用吗? WebClient.DownloadDataAsyn() 问题
【发布时间】:2009-10-20 21:11:20
【问题描述】:

我有一个名为 SiteAsyncDownload.cs

的类

代码如下:

public class SiteAsyncDownloader
{
    WebClient Client = new WebClient();
    string SiteSource = null;

    /// <summary>
    /// Download asynchronously the source code of any site in string format.
    /// </summary>
    /// <param name="URL">Site URL to download.</param>
    /// <returns>Website source code - string.</returns>
    public string GetSite(string URL)
    {
        Uri Site = new Uri(URL);

        Client.DownloadDataAsync(Site);
        Client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(FinishedDownloading);

        //Don't know if this would work. Consult with StackOverflow.
        while (true)
        {
            if (SiteSource != null)
            {
                return SiteSource;
            }
        }            
    }

    void FinishedDownloading(object sender, DownloadDataCompletedEventArgs e)
    {
        SiteSource = Encoding.ASCII.GetString(e.Result);
        throw new NotImplementedException();
    }
}

如果这能按我的意愿工作,我不是 100%。我希望班级异步下载它需要的任何内容,下载完成后返回字符串。这是正确的方法吗?

例如,这是我打算如何使用它的示例:

SiteAsyncDownloader Downloader = new SiteAsyncDownloader();

    /// <summary>
    /// Search for a movie using only a name.
    /// </summary>
    /// <param name="MovieName">Movie name.</param>        
    public void SearchMovie(string MovieName)
    {
        string SearchURL = FormatSearch(MovieName);

        string SearchSource = Downloader.GetSite(SearchURL);

        string MovieURL = FindMovieURL(SearchSource);
        string MovieSource = Downloader.GetSite(MovieURL);

        FindInformation(MovieSource);
    }

在 SearchMovie() 方法的第二行代码中,我的程序会因为异步下载而崩溃吗?我该如何考虑这一点并使其正常工作?

【问题讨论】:

    标签: c# asynchronous screen-scraping webclient


    【解决方案1】:

    你想在这里做什么:

    while (true)
    

    只会加速 CPU 直到操作完成,首先打破它是异步的点。您需要使用event patterncallback pattern

    【讨论】:

      【解决方案2】:

      虽然它可能会起作用,但这是个坏主意。如果您要立即阻塞直到结果出来,那么使用异步 API 是没有意义的。如果在获得数据之前您真的无法在该线程中做更多工作,并且您只有一个请求,那么只需使用同步 API。此外,您阻塞的方式只是紧密循环,这将导致您的处理器无缘无故地旋转。

      在一个稍微不同的问题上,如果我是你,我不会使用Encoding.ASCII - 你应该尊重服务器发送的任何编码。使用DownloadStringAsync 是最简单的方法。

      【讨论】:

      • 乔恩,我只使用异步方法,所以当我的程序下载站点源代码时,我的 GUI 不会冻结。我的代码不会冻结源代码吗?另一方面,我对网络抓取有点陌生。除了使用 encoding.ASCII,我可以使用什么来下载网站源代码以进行抓取?
      • 它将锁定 GUI,因为您的 while (true) 只是在 非常 紧密循环中循环,直到检索到值,这会占用(所有)CPU 时间来自 GUI。
      • 感谢黑暗刺客的评论。你建议我做什么来解决这个问题。
      • 看看我的回答中的链接,它们应该会让你上路。您还可以使用 Google 事件和回调模式,这也可以为您提供更多资源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多