Я хотел бы использовать WebClient
(или есть другой лучший вариант?), Но есть проблема. Я понимаю, что открытие потока занимает некоторое время, и этого нельзя избежать. Однако чтение занимает, как ни странно, гораздо больше времени, чем полное чтение.
Есть ли лучший способ сделать это? Я имею в виду два способа, чтобы строки и файл. Progress
- мой собственный делегат, и он работает хорошо.
ПЯТОЕ ОБНОВЛЕНИЕ:
Наконец-то мне удалось это сделать. Тем временем я проверил некоторые решения, которые заставили меня понять, что проблема лежит в другом месте.
Я протестировал пользовательские WebResponse
и WebRequest
объекты, библиотеку libCURL.NET
и даже Sockets
.
Разница во времени заключалась в сжатии gzip. Длина сжатого потока была просто вдвое меньше обычной длины потока, поэтому время загрузки с браузером составляло менее 3 секунд.
Я добавлю код, если кто-то захочет узнать, как я это решил: (некоторые заголовки не нужны)
public static string DownloadString(string URL)
{
WebClient client = new WebClient();
client.Headers["User-Agent"] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1045 Safari/532.5";
client.Headers["Accept"] = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
client.Headers["Accept-Encoding"] = "gzip,deflate,sdch";
client.Headers["Accept-Charset"] = "ISO-8859-2,utf-8;q=0.7,*;q=0.3";
Stream inputStream = client.OpenRead(new Uri(URL));
MemoryStream memoryStream = new MemoryStream();
const int size = 32 * 4096;
byte[] buffer = new byte[size];
if (client.ResponseHeaders["Content-Encoding"] == "gzip")
{
inputStream = new GZipStream(inputStream, CompressionMode.Decompress);
}
int count = 0;
do
{
count = inputStream.Read(buffer, 0, size);
if (count > 0)
{
memoryStream.Write(buffer, 0, count);
}
}
while (count > 0);
string result = Encoding.Default.GetString(memoryStream.ToArray());
memoryStream.Close();
inputStream.Close();
return result;
}
Я думаю, что асинхронные функции будут почти такими же. Но я просто использую другой поток, чтобы запустить эту функцию. Я не нуждаюсь в индикации прогресса.