ตั้งค่าการหมดเวลาสำหรับ webClientDownloadFile ()


92

ฉันกำลังใช้webClient.DownloadFile()เพื่อดาวน์โหลดไฟล์ฉันสามารถกำหนดระยะหมดเวลาสำหรับสิ่งนี้เพื่อที่จะไม่ใช้เวลานานมากหากไม่สามารถเข้าถึงไฟล์ได้?

คำตอบ:


42

ลองWebClient.DownloadFileAsync(). คุณสามารถโทรCancelAsync()ตามตัวจับเวลาและหมดเวลาของคุณเอง


2
ฉันไม่ต้องการใช้ตัวจับเวลาหรือนาฬิกาจับเวลา ฉันต้องการวิธีแฮ็คหรือ API ในตัว การใช้ตัวจับเวลา / นาฬิกาจับเวลาทำให้ฉันเสียค่าใช้จ่ายเพิ่มเติมในการรับชมในขณะที่คุณสมบัตินี้อาจใช้งานได้แล้วดังนั้นทำไมต้องประดิษฐ์วงล้อขึ้นมาใหม่

@Kilanny: จากนั้นไปกับคำตอบจากคำตอบอื่น หรือใช้ HttpClient และตั้งค่าคุณสมบัติ Timeout นอกจากนี้โปรดทราบว่าคำตอบนี้มาจากปี 2009
abatishchev

8
ในสุทธิ 4.5 + คุณยังสามารถใช้var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")แล้วtaskDownload.Wait(TimeSpan.FromSeconds(5));
itsho

258

คำตอบของฉันมาจากที่นี่

คุณสามารถสร้างคลาสที่ได้รับซึ่งจะตั้งค่าคุณสมบัติการหมดเวลาของ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
ในกรณีที่มีคนอื่นเจอรหัสที่เป็นประโยชน์นี้ฉันต้องตั้งค่าระยะหมดเวลาก่อนที่จะโทร GetWebRequest (ที่อยู่)
Darthtong

Resharper บ่นเกี่ยวกับค่า null ที่เป็นไปได้สำหรับ "result" และแนะนำการตรวจสอบ null ก่อนตั้งค่า Timeout เป็น WebRequest เมื่อดูโค้ดที่ถอดรหัสแล้วดูเหมือนจะเป็นไปไม่ได้เว้นแต่คุณจะให้ WebRequestModules ที่กำหนดเองใน web.config ของคุณ แต่สำหรับคำตอบที่ได้รับการโหวตแล้วฉันจะเพิ่มในกรณีนี้
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: ใช้ HttpClient แทน WebClient
abatishchev

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 แนะนำไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้


@jeffymorris ไม่ได้ผลสำหรับฉัน ฉันยังคงได้รับ WebException แจ้งว่า "คำขอถูกยกเลิก - การดำเนินการหมดเวลาแล้ว" แม้ว่าฉันจะระบุว่าstream.ReadTimeoutใหญ่กว่าที่ใช้ในการดำเนินการตามคำขอ
ก็ตาม

ในทางกลับกันการแก้ปัญหาด้วย webclient subclass ก็ไม่ได้ผลเช่นกันดังนั้นอาจเป็นปัญหาที่ฝั่งเซิร์ฟเวอร์
chester89
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.