多线程访问ListViewItem的问题

znull 2006-10-17 04:42:15
代码如下:
private void tsbImport_Click(object sender, EventArgs e)
{
this._importThread = new Thread(new ThreadStart(readItem));
this._importThread.Start();
}

private void readItem()
{
foreach (ListViewItem item in this.lvwFiles.Items)//异常地方
{
//...
}
}

运行后,出现异常提示“线程间操作无效:从不是创建控件lvwFiles线程访问它”。
如何解决,请各位帮修改代码,多谢!
...全文
305 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmrbak 2010-06-24
  • 打赏
  • 举报
回复
private delegate ListViewItem PhoneListItemReadDelegate(int index);
zmrbak 2010-06-24
  • 打赏
  • 举报
回复
从线程访问窗口,必须使用代理
zmrbak 2010-06-24
  • 打赏
  • 举报
回复
private delegate ListViewItem PhoneListItemReadDelegate(int index);
public ListViewItem getlv系统设置PhoneListItem(int index)
{
if (lv系统设置PhoneList.InvokeRequired)
{
PhoneListItemReadDelegate d = new PhoneListItemReadDelegate(getlv系统设置PhoneListItem);
return (ListViewItem)(this.Invoke(d, new object[] { index }));
}
else
{
if (index < 0)
{
return null;
}
if (index < this.lv系统设置PhoneList.Items.Count)
{
return this.lv系统设置PhoneList.Items[index];
}
else
{
return null;
}
}
}
CTBOK 2006-12-12
  • 打赏
  • 举报
回复
mark,正有用
marvelstack 2006-10-20
  • 打赏
  • 举报
回复
必须使用Control.Invoke或Control.BeginInvoke方式来异步操作。
通过多线程为基于 .NET 的应用程序实现响应迅速的用户
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
为Windows应用创建简单的异步调用模式
http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx
aafshzj 2006-10-19
  • 打赏
  • 举报
回复
在.net中不能直接在UI Control的创建线程之外修改UI Control的属性和内容。一个基本办法是通过调用UIControl 的Invoke方法。考虑一个简单的例子:我们希望在一个通过btnStart启动的线程A中,每隔10秒把txtTime的Text属性更新为:线程A的线程名+线程A传入的“当前时间”。



下面是主要代码

private void btnStart_Click(object sender, System.EventArgs e)
{
Thread th = new Thread(new ThreadStart(WorkThreadMethod));
th.Name = "TH" + i;
th.Start();
}

public delegate void UpdateTextCallback(string threadName, DateTime time);

private void WorkThreadMethod()
{
Thread.Sleep(10000);
txtTime.Invoke(new UpdateTextCallback(this.UpdateText), new object[]{Thread.CurrentThread.Name, DateTime.Now});
}

private void UpdateText(string threadName, DateTime)
{
txtTime.Text = threadName + time.ToString();
}


欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
jx0797 2006-10-19
  • 打赏
  • 举报
回复
control.invoke()
用这个方法吧,保证没问题的~~
xiehuanxie才是完美的~
xu_2007 2006-10-19
  • 打赏
  • 举报
回复
本人测试了,加入CheckForIllegalCrossThreadCalls = false;这句的确可以!
Radar2006 2006-10-18
  • 打赏
  • 举报
回复
vs2005要简单些,直接调用匿名方法
vs2003要先定义delegate
tdhao 2006-10-18
  • 打赏
  • 举报
回复
在构造函数中增加一句
CheckForIllegalCrossThreadCalls = false;
就行了

请问这个属性主要起什么作用?
------------------------------------------
以2003的方式运行线程
znull 2006-10-18
  • 打赏
  • 举报
回复
楼上的多谢了。
线程启动后,在
foreach (ListViewItem item in this.lvwFiles.Items) 就出现异常了,根本无法执行到Read(item)。
xu_2007 2006-10-18
  • 打赏
  • 举报
回复
在构造函数中增加一句
CheckForIllegalCrossThreadCalls = false;
就行了

请问这个属性主要起什么作用?
chenhui530 2006-10-18
  • 打赏
  • 举报
回复
绝对可以
如果是VS2005的话
jetxia 2006-10-18
  • 打赏
  • 举报
回复
楼上的也不行吧
chenhui530 2006-10-18
  • 打赏
  • 举报
回复
在构造函数中增加一句
CheckForIllegalCrossThreadCalls = false;
就行了
xu_2007 2006-10-18
  • 打赏
  • 举报
回复
private void readItem()
{
Read();
}
private delegate void ReadDelegate();

private void Read()
{
foreach (ListViewItem item in this.lvwFiles.Items)//异常地方
{
if (item.InvokeRequest)
{
item.Invoke(new ReadDelegate(Read), new object[] {item};
}
else
{
// read here.
}
}
}
不知这样行吗?
feiyun0112 2006-10-18
  • 打赏
  • 举报
回复
li01bin(啊!斌) 你的是不是2003

他的肯定是2005



*****************************************************************************
欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码)
http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
li01bin 2006-10-18
  • 打赏
  • 举报
回复
很想帮忙 但我用你的代码 没有问题 不知道 是不是其他关联的地方
xiehuanxie 2006-10-17
  • 打赏
  • 举报
回复
private void readItem()
{
foreach (ListViewItem item in this.lvwFiles.Items)//异常地方
{
Read(item);
}
}
private delegate void ReadDelegate(ListViewItem item);

private void Read(ListViewItem item)
{
if (item.InvokeRequest)
{
item.Invoke(new ReadDelegate(Read), new object[] {item};
}
else
{
// read here.
}
}

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧