这种异步下载有用吗? WebClient.DownloadDataAsyn()问题

时间:2009-10-20 21:11:21

标签: c# asynchronous screen-scraping webclient

我有一个名为 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()方法的第二行代码中,我的程序会崩溃,因为它是异步下载吗?如何将其考虑在内并使其正常工作?

2 个答案:

答案 0 :(得分:3)

你在这里想做什么:

while (true)

只需启动CPU直到操作完成,首先就会失去它的异步点。您需要使用event patterncallback pattern

答案 1 :(得分:1)

虽然它可能会起作用,但这是一个坏主意。如果您在结果发布之前立即阻止,则使用异步API毫无意义。如果你在获得数据之前真的无法在该线程中再做任何工作,并且你只有一个请求,那就使用同步API。此外,您阻止的方式只是紧密循环,这将导致您的处理器无缘无故地旋转。

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