日期:2014-05-20  浏览次数:20829 次

listview在virtual模式时的问题
感觉virtual模式是这样的和一个数据域绑定,显示范围是virtualsize个项目,实际并不加载到界面,当需要显示时,加载要显示的项目

1、上述理解正确否?
2、retrievevirtualitem事件处理函数是发生在需要显示未加载进界面项目的时候吧?是UI线程执行么?
3、我的程序设计,后台线程tbk动态修改一个list实例对象(这个list实例对象即为listview绑定的数据域),virtualsize=list.count动态变化,使用monitor对后台tbk线程和主线程(ui线程)进行同步

代码:

后台线程(循环执行,周期性的更新list的内容)
monitor.enter(list);
//修改list
先list.clear();
后list.add()
再设置控件的virtualsize=list.count
monitor.exit(list);

主线程
在void OnRetriveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
  monitor.enter(list);
  e.Item = list[e.ItemIndex];
  monitor.exit(list);
}

问题:
【1】这样可以实现ui线程和tbk线程对共享资源list的互斥访问么?
【2】OnRetriveVirtualItem是在主线程执行么
【3】OnRetriveVirtualItem有索引超出范围的异常报出,不知是何原因

------解决方案--------------------
1 是
2 是
1 没看到哪里有线程安全的代码
2 是
3 线程安全问题