2011-08-27 40 views
7

Tôi đang sử dụng webclient để tải xuống tệp. Tôi đang tính toán tỷ lệ phần trăm tiến độ như bên dướiTính tỷ lệ phần trăm tiến độ

  1. Tôi biết được tệp (tôi đọc nó từ bảng cơ sở dữ liệu) của tệp sẽ được tải xuống.

  2. Tôi phụ thuộc vào thuộc tính BytesRecieved của WebClient để biết tổng số byte được tìm nạp trong khi tải xuống.

  3. Thuật toán tôi đang sử dụng là double dProgress = (e.BytesReceived/FileSize)*100); để tính phần trăm tiến độ.

Tuy nhiên tôi không nhận được phần trăm tiến độ chính xác để cập nhật thanh tiến trình.

Có phương pháp nào để tính tỷ lệ phần trăm tiến trình không?

+0

Bạn có mã nào? –

+0

xin lỗi, tôi không hiểu những gì bạn vừa nói. – logeeks

+1

Làm sao bạn biết nó sai? Nó luôn giống nhau không? 0? NaN? > 100? Tiêu cực? Vấn đề chính xác là gì? – Cameron

Trả lời

17

Nhìn vào dòng sau: double dProgress = (e.BytesReceived/FileSize)*100)

Nếu cả hai e.BytesReceivedFileSize là các số nguyên sau đó bạn sẽ luôn có 0 * 100 = 0.

Make một cái gì đó như thế này:

double dProgress = ((double)e.BytesReceived/FileSize)*100.0

Đó là vì / không phân chia số nguyên khi chia hai số nguyên. Nhưng bạn không muốn điều đó. Vì vậy, bạn chuyển đổi một trong các biến thành double.

+0

tôi đã sử dụng mã của bạn và nhận thấy rằng mã được tạo chính xác. tuy nhiên thanh tiến trình chỉ được điền vào quý. tôi đang sử dụng tối thiểu là 1 và tối đa là 100. bước tối thiểu là 0,1 và bước tối đa là 1,0.những ý tưởng? – logeeks

1

BytesReceived và Dung lượng có lẽ hầu hết là các số nguyên, do đó bạn cần phải tính toán tiến bộ theo cách này:

double dProgress = 100.0 * e.BytesReceived/FileSize; 
1

Vấn đề là cả hai con số là các số nguyên. Khi bạn chia họ, họ trở nên nhỏ hơn 1, vì vậy họ làm tròn xuống đến 0. thợ đúc chư họ đưa ra kết quả một float:

double dProgress = ((double)e.BytesReceived/FileSize)*100) 
3

Nếu bạn đang xử lý trường hợp DownloadProgressChanged khi thực hiện một tải không đồng bộ, args sự kiện đã có ProgressPercentage trên đó, vì vậy không có điểm nào trong việc phát minh lại nó. Một ví dụ giả tạo:

var client = new WebClient(); 
var reset = new ManualResetEvent(false); 
client.DownloadProgressChanged += (s, e) => Console.WriteLine("{0} percent complete", e.ProgressPercentage); 
client.DownloadFileCompleted += (s, e) => reset.Set(); 
client.DownloadFileAsync(new Uri("http://myfilepathhere.com"), "file.name"); 
//Block till download completes 
reset.WaitOne(); 
+0

+ 1, công trình tuyệt vời :) –

+0

Tôi đang nhận được e.Progresspercentage luôn luôn là 0 vì vậy tôi đang tìm kiếm các phương pháp thay thế – logeeks

0

Hãy thử điều này:

WebClient Client = new WebClient(); 
Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 

...

void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { 

      double bytesIn = double.Parse(e.BytesReceived.ToString()); 
      double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); 
      double percentage = bytesIn/totalBytes * 100; 
      int percente = int.Parse(Math.Truncate(percentage).ToString()); 
      progressBar.Value = percente; 
     } 

Hoặc chỉ cần sử dụng giá trị ProgressPercentage.

void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { 
      progressBar.Value = e.ProgressPercentage; 
    } 
+2

Tôi biết tôi trễ một năm rưỡi, nhưng tôi phải trả lời điều này. Đây có phải là ** double.Parse (e.BytesReceived.ToString()) ** trolling hoặc bạn không biết loại truyền là gì? – mnn

1

Đây là vấn đề rất khó khăn với số học cơ bản và truyền trong C#.

Giải pháp

Lần đầu tiên lưu kết quả phân chia số nguyên trong biến kép. Và sau đó nhập vào một số nguyên.

int x = 5, y = 10, answer; 
double ansDouble; 
answer = (int)(x/y) * 100; //percentage calculation 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=0 

answer = (int)((double)x/y) * 100; //percentage calculation 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=0 

answer = (int)((double)x/(double)y) * 100; //percentage calculation 
Console.WriteLine("x={0}", answer); 
//>output percentage=0 

answer = (int)(x/(double)y) * 100; //percentage calculation 
Console.WriteLine("x={0}", answer); 
//>output percentage=0 

ansDouble = ((double)x/y) * 100; 
answer = (int)ansDouble; 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=50 

điểm cần lưu ý

Hóa ra rằng x/y = 0, đối với bất kỳ giá trị của x và y miễn là họ là các số nguyên Chúng ta không thể giải quyết việc này trong một dòng bởi bất kỳ sự kết hợp đúc

Các vấn đề liên quan