使用后台线程时,有效地显示文件状态

时间:2010-05-11 21:30:41

标签: c# multithreading statusbar

如何在使用后台线程时有效地显示文件的状态?

例如,假设我有一个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(...)
        }
}

3 个答案:

答案 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;
        }
    }