2012-06-03 16 views
6

Tôi đang viết một ứng dụng tải lên các tệp lớn lên dịch vụ web bằng cách sử dụng HttpWebRequest.Gửi tệp lớn với HttpWebRequest, phát triển/thu hẹp bộ đệm khi cần

Ứng dụng này sẽ được điều hành bởi nhiều người với tốc độ internet khác nhau.

Tôi đọc đồng bộ tệp một cách không đồng bộ và ghi không đồng bộ các đoạn đó vào luồng yêu cầu. Tôi làm điều này trong một vòng lặp bằng cách sử dụng callbacks. Và tôi tiếp tục làm điều này cho đến khi toàn bộ tập tin đã được gửi đi.

Tốc độ tải lên được tính giữa các lần viết và GUI sau đó được cập nhật để hiển thị tốc độ nói.

Vấn đề tôi đang gặp phải đang quyết định kích thước bộ đệm. Nếu tôi làm cho nó quá lớn, người dùng có kết nối chậm sẽ không thấy các cập nhật thường xuyên về tốc độ. Nếu tôi làm cho nó quá nhỏ, người dùng với các kết nối nhanh sẽ kết thúc "búa" các phương pháp đọc/ghi gây ra việc sử dụng CPU để tăng đột biến.

Điều tôi đang làm bây giờ là bắt đầu bộ đệm ở 128kb, và sau đó cứ 10 lần tôi kiểm tra tốc độ ghi trung bình của 10 ghi đó, và nếu dưới một giây tôi tăng dung lượng bộ đệm lên 128kb. Tôi cũng thu nhỏ bộ đệm theo cách tương tự nếu tốc độ ghi giảm xuống dưới 5 giây.

Điều này hoạt động khá tốt, nhưng tất cả đều cảm thấy rất tùy tiện và có vẻ như có chỗ để cải thiện. Câu hỏi của tôi là, có ai xử lý một tình huống tương tự và bạn đã thực hiện hành động gì?

Cảm ơn

+1

Điều này có vẻ như một cách tiếp cận rất chắc chắn. Và nó cũng hoạt động. Tôi sẽ không thay đổi nó. – zmbq

Trả lời

0

Tôi nghĩ đây là một cách tiếp cận tốt. Tôi cũng đã sử dụng trong quá trình tải lên tệp lớn. Nhưng có một tweek nhỏ trong đó. Tôi đã xác định tốc độ kết nối trong yêu cầu đầu tiên bằng cách thực hiện cuộc gọi đến dịch vụ khác của tôi. Điều này thực sự sẽ tiết kiệm chi phí cho việc tính toán lại tốc độ với mọi yêu cầu. Lý do chính làm như vậy là

  1. Kết nối chậm, tốc độ thường dao động rất nhiều. Do đó tính toán lại nó theo mọi yêu cầu không có ý nghĩa.

  2. Tôi được cho là cung cấp cơ sở tiếp tục cũng là nơi người dùng có thể tải lại tệp từ thời điểm kết thúc lần trước.

Xem xét khả năng mở rộng, tôi đã sử dụng để sửa bộ đệm theo yêu cầu đầu tiên. Hãy cho tôi biết nếu nó đã giúp

+0

Tôi đã làm nó theo cách tôi đã đề cập và nó hoạt động rất tốt. Tôi không bao giờ thích ý tưởng của việc xác định tốc độ theo cách bạn đề cập, bởi vì nó có thể cung cấp cho đọc sai nếu các máy chủ lưu trữ ở một quốc gia khác nhau hoặc đã có một ngày chậm. Tuy nhiên bạn nâng cao một số điểm tốt. Đã chấp nhận câu trả lời của bạn. – NoPyGod