【发布时间】:2021-07-09 09:27:55
【问题描述】:
我正在尝试编写一个 C# 应用程序,在复制多个文件时更新进度条。我正在使用这种方法进行复制,需要 Dictionary<string, string>:
public static async Task CopyFiles(Dictionary<string, string> files, IProgress<int> progressCallback)
{
for (var x = 0; x < files.Count; x++)
{
var item = files.ElementAt(x);
var from = item.Key;
var to = item.Value;
using (var outStream = new FileStream(to, FileMode.Create, FileAccess.Write, FileShare.Read))
{
using (var inStream = new FileStream(from, FileMode.Open, FileAccess.Read, FileShare.Read))
{
await inStream.CopyToAsync(outStream);
}
}
var percentComplete = ((x + 1) / files.Count) * 100;
//progressCallback((int)((x + 1) / files.Count) * 100);
progressCallback.Report(percentComplete);
}
}
在我的主类中,我正在使用以下代码尝试更新我的进度条 (progressBar1),但此代码似乎无法正常工作,似乎在复制两个文件和结束时完成了 ProgressBar大约需要一秒钟才能完成,不知道为什么会这样。
private async void button4_Click(object sender, EventArgs e)
{
button4.Enabled = false;
var progress = new Progress<int>(percent =>
{
progressBar1.Value = percent;
});
await Copier.CopyFiles(new Dictionary<string, string> {
{ Source1, Destination1 },
{ Source2, Destination2 }
},
progress);
button4.Enabled = true;
MessageBox.Show("Completed");
}
}
【问题讨论】:
-
考虑使用调度程序异步调用
progressCallback(在 UI 线程中运行回调)。至于不起作用,预期的行为是什么?需要超过一秒钟吗?如果把CopyToAsync换成Task.Delay,问题还在吗? -
使用 var percentComplete = (((x + 1) * 100) / 2) ****** 当使用 ((x + 1) / files.Count) * 100 结果为零。
-
@Sinatr 这就是进度条所做的。它没有任何问题。它实际上比硬编码对 UI 或更糟糕的特定控件的调用更可取。另一方面,整数除法可能很有趣
-
整数除法保证小于
files.Count的值将为0,此时结果将为1。但没有理由在异步方法中计算百分比。您可以指定进度条的当前值和最大值,并仅报告x。您可以报告复杂的对象,而不仅仅是原始类型