Saya menggunakan webClient.DownloadFile()
untuk mengunduh file, dapatkah saya menyetel waktu tunggu untuk ini sehingga tidak akan memakan waktu lama jika tidak dapat mengakses file?
Jawaban:
Coba WebClient.DownloadFileAsync()
. Anda dapat menelepon CancelAsync()
dengan timer dengan batas waktu Anda sendiri.
var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")
dan kemudiantaskDownload.Wait(TimeSpan.FromSeconds(5));
Jawaban saya datang dari sini
Anda dapat membuat kelas turunan, yang akan menyetel properti batas waktu dari WebRequest
kelas dasar :
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;
}
}
dan Anda dapat menggunakannya seperti kelas WebClient dasar.
request.Timeout
. Pesan kesalahan '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?)
, apa yang saya lewatkan?
using
arahan yang digunakan oleh cuplikan kode ini.
Dengan asumsi Anda ingin melakukan ini secara sinkron, menggunakan metode WebClient.OpenRead (...) dan menyetel waktu tunggu pada Stream yang dikembalikannya akan memberi Anda hasil yang diinginkan:
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);
}
}
}
}
Berasal dari WebClient dan mengganti GetWebRequest (...) untuk menyetel batas waktu yang disarankan @Beniamin, tidak berfungsi untuk saya seperti, tetapi ini berhasil.
stream.ReadTimeout
lebih besar dari yang sebenarnya diperlukan untuk menjalankan permintaan