Метод DownloadStringAsync использует модель события, вызывая DownloadStringCompleted после его завершения. Вы также можете остановить запрос, если он занимает слишком много времени, позвонив по номеру WebClient.CancelAsync()
. Это позволит вашему основному потоку запросов и вашему потоку WebClient работать параллельно и позволит вам точно определить, как долго вы хотите, чтобы ваш основной поток ожидал перед возвратом.
В приведенном ниже примере мы инициируем загрузку и устанавливаем обработчик события, который мы хотим вызвать, когда он закончится. DownloadStringAsync немедленно возвращается, поэтому мы можем продолжить обработку остальной части нашего запроса.
Чтобы продемонстрировать более детальный контроль над этой операцией, когда мы достигнем конца действия нашего контроллера, мы можем проверить, завершена ли загрузка еще; если нет, дайте ему еще 3 секунды, а затем прервите.
string downloadString = null;
ActionResult MyAction()
{
//get the download location
WebClient client = StartDownload(uri);
//do other stuff
CheckAndFinalizeDownload(client);
client.Dispose();
}
WebClient StartDownload(Uri uri)
{
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Download_Completed);
client.DownloadStringAsync(uri);
return client;
}
void CheckAndFinalizeDownload(WebClient client)
{
if(this.downloadString == null)
{
Thread.Sleep(3000);
}
if(this.downloadString == null)
{
client.CancelAsync();
this.downloadString = string.Empty;
}
}
void Download_Completed(object sender, DownloadStringCompletedEventArgs e)
{
if(!e.Cancelled && e.Error == null)
{
this.downloadString = (string)e.Result;
}
}