【发布时间】:2018-09-05 13:45:26
【问题描述】:
我有以下监控上传过程的代码。我正在使用e.ProgressPercentage 跟踪当前进度,但它返回了错误的值。
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(DataIO.FTP.Username, DataIO.FTP.Password);
Uri uri = new Uri($"ftp://{DataIO.FTP.Server}/{DataIO.FTP.UploadDir}/{DataIO.SelectedOutputArchive}.tar.gz");
client.UploadProgressChanged += new UploadProgressChangedEventHandler(delegate (object s2, UploadProgressChangedEventArgs e2) {
ProgressLabel.Invoke((MethodInvoker)delegate
{
ProgressLabel.Text = $"{(e2.BytesSent / 1024).ToString()} KB / {(e2.TotalBytesToSend / 1024).ToString()} KB";
});
UploadProgressBar.Invoke((MethodInvoker)delegate
{
UploadProgressBar.Value = e2.ProgressPercentage; // returns 0-50
//UploadProgressBar.Value = (int)Clamp((float)e2.ProgressPercentage / 50 * 100, 0, 100);
});
Debug.WriteLine(e2.ProgressPercentage);
});
client.UploadFileCompleted += new UploadFileCompletedEventHandler(delegate {
this.Invoke((MethodInvoker)delegate
{
this.Text = "Upload: Success";
});
Thread.Sleep(2000);
this.Invoke((MethodInvoker)delegate
{
this.Close();
});
});
client.UploadFileAsync(uri, "STOR", localFilePath);
}
我尝试在输出窗口调试它,它返回的值是这样的:
0
0
1
0
1
0
1
1
1
2
2
1
2
2
3
3
2
3
3
...
49
49
50
49
100
49
49
这些后跳不一定重要,但从 49 跳到 100 很重要。
我假设它总是在 0-50 之间返回(在意识到它不会从 50 上升之后)。所以我需要将它缩放到 0-100。这行得通,但随后它从 49 跃升至 100。缩放期望数字从 0-50,并且接收 100 打破它(导致溢出(200),进度条期望 0-100)。然后我不得不钳制结果值。所以我想出了这个:
(int)Clamp((float)e2.ProgressPercentage / 50 * 100, 0, 100)
虽然现在这可以正常工作,但我想知道为什么我需要破解我的方法才能使其正常工作。我做错了吗?
更新:我决定不依赖e.ProgressPercentage,自己计算:
UploadProgressBar.Value = (int)(e2.BytesSent / (float)e2.TotalBytesToSend * 100);
【问题讨论】:
标签: c# file-upload ftp webclient