我有一个名为 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()方法的第二行代码中,我的程序会崩溃,因为它是异步下载吗?如何将其考虑在内并使其正常工作?
答案 0 :(得分:3)
答案 1 :(得分:1)
虽然它可能会起作用,但这是一个坏主意。如果您在结果发布之前立即阻止,则使用异步API毫无意义。如果你在获得数据之前真的无法在该线程中再做任何工作,并且你只有一个请求,那就使用同步API。此外,您阻止的方式只是紧密循环,这将导致您的处理器无缘无故地旋转。
在一个稍微不同的问题上,如果我是你,我不会使用Encoding.ASCII
- 你应该尊重服务器发送的任何编码。使用DownloadStringAsync
是最简单的方法。