DownloadStringAsync yöntemi, bittiğinde DownloadStringCompleted'u yükselterek bir olay modeli kullanır. Ayrıca, WebClient.CancelAsync()
numaralı telefonu arayarak çok uzun sürüyorsa isteği durdurabilirsiniz. Bu, ana istek iş parçacığınızın ve WebClient iş parçacığının paralel olarak çalışmasına izin verir ve ana iş parçacığının ne kadar süre sonra dönmesini beklemeniz gerektiğine karar vermenizi sağlar.
Aşağıdaki örnekte, indirme işlemini başlattık ve tamamlandığında başlatılmasını istediğiniz olay işleyicisini ayarlıyoruz. DownloadStringAsync hemen geri döner, böylece isteğimizin geri kalanını işleme devam edebiliriz.
Bu işlem üzerinde daha ayrıntılı bir denetim göstermek için, denetleyici eylemimizin sonuna ulaştığımızda, indirme işleminin tamamlanıp tamamlanmadığını kontrol edebiliriz; değilse, 3 saniye daha verin ve sonra iptal edin.
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;
}
}
Webclient async çağrısı için bir zaman aşımı eklemenin bir yolu var mı? –
Sadece bir not, bu cevap MVC 1.0 gün içinde geri 09 gibi görünüyor. Şimdi MVC 2/3 ile cevap farklıdır. MapAsyncRoute yöntemi gitti ve artık gerekmiyor. Ayrıca, MyAction yönteminin şimdi MyActionAsync olarak yeniden adlandırılması gerekiyor.Aksi takdirde, her şey aynı şekilde çalışır. – BFree