在主窗体下创建一个listview控件,有一个线程定时刷新listview的数据,可是会提示“线程间无效操作:不是创建控件“lvUsers”的线程访问它。”的错误!
在2003下没有问题换成2005后才出现的这个问题。
我得解决办法是,线程不在操作listview控件,而是把数据加入一个arraylist里,用timer控件定数刷新listview里的数据,有没有比这个更好的方法
在2003下没有问题换成2005后才出现的这个问题。
我得解决办法是,线程不在操作listview控件,而是把数据加入一个arraylist里,用timer控件定数刷新listview里的数据,有没有比这个更好的方法
解决方案 »
- 求北大青鸟S2笔试机试题目,不是为了作弊为了练练手而已有没有答案源码无所谓
- 很简单的问题
- 页面源代码中出现了多个<DIV id=item>, 也就是出现很多ID相同的DIV元素, 应该如何分别得到这些元素(HtmlElement)?
- 关于摄像头录像(“PostMessage”以及“异步”如何实现)
- 请问在网站发布传到网上后 还能用asp.net网站管理工具么?
- DataGridView 删除行问题
- 关于一个POOL的代码!
- html自动提交表单问题
- 如何让密码输入项的textbox里显示的是星号
- 用c#怎样实现知道一个qq号是否在线?
- 如何以IOCP方式实现网络数据传输?
- 一个asp.net 2.0的master/content Page 问题
VS2005对跨线程访问UI控件做了安全性保护策略.你所要做的,是在这一策略下,使用委托的方法,使UI线程自己去更新ListView(当然更新的处理逻辑还是在子线程里面做)
Control.InvokeRequired 属性
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
private delegate void InvokeMethod();internal void setListView()
{
if (this.InvokeRequired)
{
InvokeMethod _setListView = new InvokeMethod(this.setListView);
this.Invoke(_setListView);
return;
}
//....正常的操作
}
取消线线程安全保护模式!
这样就和2003一样了或者在VS2005中使用 BackgroundWorker 控件进行的线程安全调用
在应用程序中实现多线程的首选方式是使用 BackgroundWorker 组件。BackgroundWorker 组件使用事件驱动模型实现多线程。辅助线程运行 DoWork 事件处理程序,创建控件的线程运行 ProgressChanged 和 RunWorkerCompleted 事件处理程序。注意不要从 DoWork 事件处理程序调用您的任何控件。