webClient.DownloadFile ()에 대한 시간 제한 설정


92

내가 사용하고 webClient.DownloadFile()내가 너무 오래는 파일에 액세스 할 수없는 경우 적용되지 않습니다 너무 이것에 대한 시간 제한을 설정할 수 있습니다 파일을 다운로드?

답변:


42

시도해보십시오 WebClient.DownloadFileAsync(). CancelAsync()자신의 타임 아웃으로 타이머로 전화를 걸 수 있습니다 .


2
타이머 나 스톱워치를 사용하고 싶지 않습니다. 내장 된 해킹 또는 API 접근 방식을 원합니다. 타이머 / 스톱워치를 사용하면 시청하는 데 추가 스레드가 필요하지만이 기능은 이미 구현

@Kilanny : 그런 다음 다른 답변의 솔루션으로 이동하십시오. 또는 HttpClient를 사용하고 Timeout 속성을 설정합니다. 또한이 답변은 2009
것임을

8
4.5+ 닷넷에서 당신은 또한 사용할 수있는 var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")다음과taskDownload.Wait(TimeSpan.FromSeconds(5));
itsho

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
다른 그냥 넣다 사람이 내가 base.GetWebRequest (주소)를 호출하기 전에 제한 시간을 설정했다이 도움이 코드를 통해 제공
Darthtong

Resharper는 "result"에 대해 가능한 null 값에 대해 불평하고 Timeout 값을 WebRequest로 설정하기 전에 null 확인을 제안합니다. 디 컴파일 된 코드를 살펴보면 web.config에 사용자 지정 WebRequestModules를 제공하지 않는 한 불가능 해 보이지만 이러한 찬성 답변의 경우 혹시라도 추가하겠습니다.
Kevin Coulombe

이 줄에서 오류가 발생합니다 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?) , 내가 무엇을 놓치고 있습니까?
Eric

1
@Eric : using이 코드 조각에서 사용하는 지시문을 추가했습니다 .
Beniamin

1
@titol : WebClient 대신 HttpClient를 사용하십시오.
abatishchev 2015 년

3

WebClient.OpenRead (...) 메서드를 사용하여이 작업을 동 기적으로 수행하고 반환하는 Stream에 시간 제한을 설정하면 원하는 결과를 얻을 수 있습니다.

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이 제안한 시간 제한을 설정했지만 저에게 효과적이지 않았습니다.


@jeffymorris는 나를 위해 일하지 않았습니다. 난 아직도 GET WebException이 "는 요청이 중단되었습니다 - 작업이 초과되었습니다"라고 내가 지정하는 경우에도 stream.ReadTimeout더 큰 실제로 요청을 실행하는 데 걸린보다
chester89을

이 서버 측에 문제가 아마 그래서 다른 한편으로 @jeffymoris는 WebClient를 서브 클래스와 솔루션 중 하나가 작동하지 않았다
chester89
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.