WebClient.DownloadFile () için zaman aşımını ayarlayın


92

webClient.DownloadFile()Bir dosyayı indirmek için kullanıyorum , bunun için bir zaman aşımı belirleyebilir miyim, böylece dosyaya erişemezse çok uzun sürmez?

Yanıtlar:


42

Deneyin WebClient.DownloadFileAsync(). CancelAsync()Kendi zaman aşımınız ile zamanlayıcı ile arama yapabilirsiniz .


2
Zamanlayıcı veya kronometre kullanmak istemiyorum. Yerleşik bir hack veya api yaklaşımı istiyorum. Zamanlayıcı / kronometre kullanmak, izlemek için ek iş parçacığına mal olurken, bu özellik zaten uygulanmış olabilir, peki neden tekerleği yeniden icat etmek

@Kilanny: O zaman başka bir cevabın çözümüne gidin. Veya HttpClient kullanın ve Timeout özelliğini ayarlayın. Ayrıca bu cevabın 2009 yılına ait olduğunu lütfen unutmayın.
abatishchev

8
.Net var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")taskDownload.Wait(TimeSpan.FromSeconds(5));
4.5+ sürümünde

258

Cevabım buradan geliyor

Temel WebRequestsınıfın zaman aşımı özelliğini ayarlayacak türetilmiş bir sınıf oluşturabilirsiniz :

using System;
using System.Net;

public class WebDownload : WebClient
{
    /// <summary>
    /// Time in milliseconds
    /// </summary>
    public int Timeout { get; set; }

    public WebDownload() : this(60000) { }

    public WebDownload(int timeout)
    {
        this.Timeout = timeout;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = this.Timeout;
        }
        return request;
    }
}

ve bunu temel WebClient sınıfı gibi kullanabilirsiniz.


3
Başka birinin bu yararlı kodla karşılaşması durumunda, üssü aramadan önce zaman aşımını ayarlamak zorunda kaldım.GetWebRequest (adres)
Darthtong

Yeniden paylaşımcı, "sonuç" için olası bir boş değerden şikayet eder ve Zaman Aşımı değerini WebRequest'e ayarlamadan önce boş bir denetim önerir. Derlenmiş koda bakıldığında, web.config dosyanıza özel bir WebRequestModules sağlamadığınız sürece imkansız görünüyor, ancak böyle bir yükseltilmiş yanıt için, her ihtimale karşı ekleyeceğim.
Kevin Coulombe

Hatayı bu satırda alıyorum request.Timeout. Hata msg 'System.Net.WebRequest' does not contain a definition for 'Timeout' and no extension method 'Timeout' accepting a first argument of type 'System.Net.WebRequest' could be found (are you missing a using directive or an assembly reference?) , neyi kaçırıyorum?
Eric

1
@Eric: usingBu kod parçacığı tarafından kullanılan yönergeler ekledim .
Beniamin

1
@titol: WebClient yerine HttpClient kullanın.
abatishchev

3

Bunu eşzamanlı olarak yapmak istediğinizi varsayarak, WebClient.OpenRead (...) yöntemini kullanarak ve geri döndürdüğü Akışta zaman aşımını ayarlamak size istenen sonucu verecektir:

using (var webClient = new WebClient())
using (var stream = webClient.OpenRead(streamingUri))
{
     if (stream != null)
     {
          stream.ReadTimeout = Timeout.Infinite;
          using (var reader = new StreamReader(stream, Encoding.UTF8, false))
          {
               string line;
               while ((line = reader.ReadLine()) != null)
               {
                    if (line != String.Empty)
                    {
                        Console.WriteLine("Count {0}", count++);
                    }
                    Console.WriteLine(line);
               }
          }
     }
}

@Beniamin'in önerdiği zaman aşımını ayarlamak için WebClient'ten türetmek ve GetWebRequest'i (...) geçersiz kılmak benim için işe yaramadı, ancak bu işe yaradı.


@jeffymorris benim için çalışmadı. İsteği stream.ReadTimeoutyürütmek için gerçekte gerekenden daha büyük bir şey
belirtsem

Diğer tarafta @jeffymoris, webclient alt sınıfının çözümü de işe yaramadı, bu yüzden muhtemelen sunucu tarafında bir sorun
chester89
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.