WebClient.DownloadFile () के लिए टाइमआउट सेट करें


92

मैं webClient.DownloadFile()एक फ़ाइल डाउनलोड करने के लिए उपयोग कर रहा हूं क्या मैं इसके लिए एक समयबाह्य सेट कर सकता हूं ताकि यह फ़ाइल तक नहीं पहुंच सके?

जवाबों:


42

कोशिश करो WebClient.DownloadFileAsync()। आप CancelAsync()अपने टाइमआउट के साथ टाइमर से कॉल कर सकते हैं ।


2
मैं टाइमर या स्टॉपवॉच का उपयोग नहीं करना चाहता। मुझे कुछ बिल्ट-इन हैक या एपी अप्रोच चाहिए। टाइमर / स्टॉपवॉच का उपयोग करने से मुझे देखने के लिए अतिरिक्त धागे का खर्च आता है, जबकि यह सुविधा शायद पहले से ही लागू है, इसलिए पहिया का फिर से आविष्कार क्यों किया जा रहा है

@ किलनी: फिर दूसरे जवाब से समाधान के साथ जाएं। या HttpClient का उपयोग करें और टाइमआउट संपत्ति सेट करें। कृपया यह भी ध्यान दें कि यह उत्तर 2009 से है।
abatishchev

8
.Net में 4.5+ आप भी उपयोग कर सकते हैं var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")और फिरtaskDownload.Wait(TimeSpan.FromSeconds(5));
इसका पहला

257

मेरा जवाब यहाँ से आता है

आप एक व्युत्पन्न वर्ग बना सकते हैं, जो आधार WebRequestवर्ग की टाइमआउट संपत्ति निर्धारित करेगा :

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;
    }
}

और आप इसे बेस WebClient वर्ग की तरह उपयोग कर सकते हैं।


3
बस किसी और को इस मददगार कोड के आधार पर लाइक करें, मुझे आधार कॉल करने से पहले टाइमआउट सेट करना था। गीतावेरीकॉस्ट (पता)
डार्थोंग

Resharper "परिणाम" के लिए एक संभावित अशक्त मान के बारे में शिकायत करता है और WebTeestest को टाइमआउट मान सेट करने से पहले एक अशक्त जांच का सुझाव देता है। विघटित कोड को देखते हुए, यह असंभव लगता है जब तक कि आप अपने web.config में एक कस्टम WebRequestModules प्रदान नहीं करते हैं, लेकिन इस तरह के उत्तर के लिए, मैं इसे सिर्फ मामले में जोड़ूंगा।
केविन कूलोमबे

मुझे इस पंक्ति में त्रुटि मिल रही है request.Timeout। त्रुटि संदेश '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?) , मुझे क्या याद आ रहा है?
एरिक

1
@ एरिक: मैंने ऐसे usingनिर्देश जोड़े हैं जो इस कोड स्निपेट द्वारा उपयोग किए जाते हैं।
बेनीमिन

1
@titol: WebClient के बजाय HttpClient का उपयोग करें।
अबशीशेव

3

मान लें कि आप WebClient.OpenRead (...) विधि का उपयोग करते हुए इसे तुल्यकालिक रूप से करना चाहते थे, और स्ट्रीम पर टाइमआउट सेट करना कि यह आपको वांछित परिणाम देगा:

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);
               }
          }
     }
}

WebClient से प्राप्त करना और GetWebRequest (...) को ओवरटाइम करने का समय निर्धारित करने के लिए @Beniamin ने सुझाव दिया, मेरे लिए काम नहीं किया, लेकिन यह किया।


@ जेफिमोरिस ने मेरे लिए काम नहीं किया। मुझे अभी भी WebException कहा गया है "अनुरोध समाप्त कर दिया गया था - ऑपरेशन का समय समाप्त हो गया है" यहां तक ​​कि अगर मैं stream.ReadTimeoutवास्तव में अनुरोध को निष्पादित करने के लिए इससे बड़ा निर्दिष्ट करता हूं
chester89

दूसरे पर @ जेफिमोरिस, वेबक्लिअन सबक्लास के साथ समाधान या तो काम नहीं किया, इसलिए यह संभवतः सर्वर साइड पर एक समस्या है
chester89
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.