ฉันกำลังใช้webClient.DownloadFile()
เพื่อดาวน์โหลดไฟล์ฉันสามารถกำหนดระยะหมดเวลาสำหรับสิ่งนี้เพื่อที่จะไม่ใช้เวลานานมากหากไม่สามารถเข้าถึงไฟล์ได้?
ฉันกำลังใช้webClient.DownloadFile()
เพื่อดาวน์โหลดไฟล์ฉันสามารถกำหนดระยะหมดเวลาสำหรับสิ่งนี้เพื่อที่จะไม่ใช้เวลานานมากหากไม่สามารถเข้าถึงไฟล์ได้?
คำตอบ:
ลองWebClient.DownloadFileAsync()
. คุณสามารถโทรCancelAsync()
ตามตัวจับเวลาและหมดเวลาของคุณเอง
var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")
แล้วtaskDownload.Wait(TimeSpan.FromSeconds(5));
คำตอบของฉันมาจากที่นี่
คุณสามารถสร้างคลาสที่ได้รับซึ่งจะตั้งค่าคุณสมบัติการหมดเวลาของ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 พื้นฐาน
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?)
ฉันขาดอะไรไป
using
คำสั่งที่ใช้โดยข้อมูลโค้ดนี้
สมมติว่าคุณต้องการทำสิ่งนี้พร้อมกันโดยใช้เมธอด 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 แนะนำไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้
stream.ReadTimeout
ใหญ่กว่าที่ใช้ในการดำเนินการตามคำขอ