Tôi muốn sử dụng số WebClient
(hoặc có một lựa chọn tốt hơn?) Nhưng có vấn đề. Tôi hiểu rằng việc mở luồng sẽ mất một thời gian và điều này không thể tránh được. Tuy nhiên, việc đọc nó mất nhiều thời gian hơn rất nhiều so với việc đọc nó hoàn toàn ngay lập tức.Làm cách nào để tải tệp xuống chuỗi có gọi lại tiến trình?
Có cách nào tốt nhất để thực hiện việc này không? Tôi có nghĩa là hai cách, để chuỗi và để tập tin. Progress
là đại biểu của riêng tôi và nó hoạt động tốt.
FIFTH UPDATE:
Cuối cùng, tôi cố gắng làm điều đó. Trong khi chờ đợi, tôi đã kiểm tra một số giải pháp khiến tôi nhận ra rằng vấn đề nằm ở nơi khác.
Tôi đã thử nghiệm các đối tượng tùy chỉnh WebResponse
và WebRequest
, thư viện libCURL.NET
và thậm chí Sockets
.
Sự khác biệt về thời gian là nén gzip. Chiều dài luồng nén chỉ đơn giản là một nửa chiều dài luồng thông thường và do đó thời gian tải xuống dưới 3 giây với trình duyệt.
tôi đặt một số mã nếu ai đó sẽ muốn biết làm thế nào tôi giải quyết thế này: (một số tiêu đề không cần thiết)
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;
}
Tôi nghĩ rằng chức năng asyncro sẽ gần như giống nhau. Nhưng tôi sẽ chỉ sử dụng một sợi khác để kích hoạt chức năng này. Tôi không cần chỉ dẫn tiến trình percise.
Chính xác thì điều gì không tốt? Chuỗi bạn viết ở đâu? – Marcel
Kết quả không tốt bởi vì nó chỉ là 2048 (iSize) ký tự từ cuối tập tin. Và nó rất chậm chạp để tải xuống tất cả. – Kaminari
Bạn dường như đang đọc cùng một luồng 'Stream' ở hai nơi; 'reader' và' streamRemote' ... Tôi đang bối rối ... Ngoài ra; xem ra: khi xử lý byte, bạn không phải lúc nào cũng đọc các khối ('iByteSize') là toàn bộ số ký tự. Nó cũng không phải là rất rõ ràng như thế nào các bản cập nhật giao diện người dùng xảy ra trong cuộc gọi lại; nếu điều này liên quan đến một chuyển đổi luồng sẽ thêm sự chậm trễ (như các 'DoEvents' bị nguyền rủa). –