You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ObjectListView中异步填充列字段数据?

ObjectListView异步填充耗时列数据的最优方案

要实现不阻塞UI且不影响其他字段填充的异步列数据加载,核心思路是先返回占位符,异步执行耗时计算,完成后再更新单元格,结合数据对象的缓存与状态标记避免重复操作,具体实现如下:

步骤1:扩展数据对象

给你的Person类增加缓存字段和计算状态标记,用于存储结果和避免重复计算:

public class Person {
    public string Name { get; set; }
    // 缓存耗时计算的结果
    public string CalculatedResult { get; set; }
    // 标记当前是否正在计算,防止重复触发异步任务
    public bool IsCalculating { get; set; }
}

步骤2:配置列的AspectGetter

在设置列的AspectGetter时,先判断缓存状态,无结果则启动异步任务,同时返回占位符:

tlist.GetColumn(0).AspectGetter = delegate(Person x) {
    // 已有计算结果,直接返回
    if (!string.IsNullOrEmpty(x.CalculatedResult)) {
        return x.CalculatedResult;
    }
    // 正在计算中,返回占位符
    if (x.IsCalculating) {
        return "加载中...";
    }

    // 标记开始计算,启动异步任务
    x.IsCalculating = true;
    // 使用Task.Run执行耗时计算(也可根据需求用BackgroundWorker)
    _ = Task.Run(() => {
        // 执行你的耗时计算逻辑,可传入Person对象关联计算
        string result = SomeCalculation(x);
        // 更新数据对象的缓存和状态
        x.CalculatedResult = result;
        x.IsCalculating = false;

        // 回到UI线程刷新对应单元格(必须在UI线程操作控件)
        tlist.Invoke((Action)(() => {
            // 刷新当前行的所有列,或指定列
            tlist.RefreshObject(x);
        }));
    });

    // 先返回占位符,避免阻塞UI
    return "加载中...";
};

关键注意事项

  • 线程安全:所有UI控件的操作必须在UI线程执行,因此要用Invoke/BeginInvoke切换线程
  • 避免重复计算:通过IsCalculating标记防止同一行多次触发异步任务,尤其是列表排序、过滤时会重新调用AspectGetter
  • 占位符优化:可根据需求替换成加载动画(ObjectListView支持自定义单元格绘制,可实现更友好的加载提示)

内容的提问来源于stack exchange,提问作者Simple Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:42:44