如何在使用后台线程时有效地显示文件的状态?
例如,假设我有一个100MB的文件:
当我通过一个线程(仅作为示例)执行下面的代码时,它运行大约1分钟:
foreach(byte b in file.bytes)
{
WriteByte(b, xxx);
}
但是......如果我想要更新用户我必须使用委托从主线程更新UI,下面的代码需要 - FOREVER - 字面意思我不知道我还在等多久,我创建了这篇文章甚至没有完成30%。
int total = file.length;
int current = 0;
foreach(byte b in file.bytes)
{
current++;
UpdateCurrentFileStatus(current, total);
WriteByte(b, xxx);
}
public delegate void UpdateCurrentFileStatus(int cur, int total);
public void UpdateCurrentFileStatus(int cur, int total)
{
// Check if invoke required, if so create instance of delegate
// the update the UI
if(this.InvokeRequired)
{
}
else
{
UpdateUI(...)
}
}
答案 0 :(得分:5)
不要在每个字节上更新UI。每100k左右才更新一次。
观察:
int total = file.length;
int current = 0;
foreach(byte b in file.bytes)
{
current++;
if (current % 100000 == 0)
{
UpdateCurrentFileStatus(current, total);
}
WriteByte(b, xxx);
}
答案 1 :(得分:2)
您过于频繁地更新UI - 100MB文件中的每个字节将导致1亿个UI更新(每个UI编组到UI线程)。
将您的更新分解为总文件大小的百分比,可能是10%甚至5%的增量。因此,如果文件大小为100字节,请在10,20,30等处更新UI
答案 2 :(得分:1)
我建议您根据已用时间进行更新,以便无论文件大小或系统负载如何都具有可预测的更新间隔:
DateTime start = DateTime.Now;
foreach (byte b in file.bytes)
{
if ((DateTime.Now - start).TotalMilliseconds >= 200)
{
UpdateCurrentFileStatus(current, total);
start = DateTime.Now;
}
}