2025年12月

场景:
在一个工厂ERP管理系统中,有部分实体的界面需要显示相关联的其它信息,而这部分信息是弱连接的,需要调用WebAPI取回,传统的方式是一一取回,结果是用户感知的速度达不到要求。
使用BackgroundWorker,在后台取资料,取完资料后再显示,如果取资料的过程中,主实体已经变更了,或者已多次变更了,则等上次任务完成后,直接再取最后一次变更的资料,中间的直接丢弃,既加快了速度,也节省了资源。
实现思路:

先加入BackgroundWorker,(命名如:BackgroundWorker_ShowItem)。

再定义两个变量,用于保存要显示的主实体(或其关联键)

private T Item = null;
private T NextItem = null;

当需要显示一个主体的内容时,不直接显示,而是呼叫BackgroundWorker来处理

public void ShowItem(T item)
{
    if (BackgroundWorker_ShowItem.IsBusy)
    {
    this.NextItem = item;
    }
    else
    {
    this.Item = item;
    this.BackgroundWorker_ShowItem.RunWorkerAsync();
    }
}

private void BackgroundWorker_ShowItem_DoWork(object sender, DoWorkEventArgs e)
{
    this.ShowItem();
}

private void BackgroundWorker_ShowItem_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (this.NextItem != null)
    {
    var nextItem = this.NextItem;
    this.NextItem = null;
    this.ShowItem(nextItem);
    }
}

注意,当ShowItem()中有访问前端时,会报“线程间操作无效”的例外,需要使用Invoke,但不要在DoWork中将ShowItem()全部包含,而应该在ShowItem()中单独处理。否则达不到性能优化的效果。