首页 新闻 赞助 找找看

加了一个Thread ,结果出现“集合已修改;可能无法执行枚举操作。”求救

0
悬赏园豆:15 [待解决问题]

 

今天在主界面里写了一个Thread,函数用While(1)循环,循环中先查找数据库中的最新记录,然后把最新记录的坐标值添加到GMap控件中的一个overlay中显示出来,王红说那个有人说把foreach改成for就好了,可是我还是出这个异常,而且位置奇怪,是程序的Program.cs文件中出现的,代码如下:

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

DevExpress.Skins.SkinManager.EnableFormSkins();
DevExpress.UserSkins.BonusSkins.Register();
UserLookAndFeel.Default.SetSkinStyle("DevExpress Style");

Application.Run(new ManageMainForm());
}

 

就最后这一句Application.Run(new ManageMainForm());出了异常,但是代码还跟不出来,愁人。。。。

qingyu1989的主页 qingyu1989 | 初学一级 | 园豆:6
提问于:2014-03-06 01:07
< >
分享
所有回答(6)
0

for里面,不要从0开始,而应该倒过来,从count-1开始

arg | 园豆:1047 (小虾三级) | 2014-03-06 06:49

好像不管用

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 11:32
0

问题不是在这里,而是出现在集合的访问上。正如错误提示,集合已修改无法再枚举。

不要在foreach循环时修改集合元素,可以通过for方式访问并修改集合元素。

lucika.zh | 园豆:62 (初学一级) | 2014-03-06 09:01

这个我也都考虑过,已经把foreach都换成for了

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 11:32

@qingyu1989: 如果多线程的话,可以采用加锁的方式,确保同一时刻只有一个线程在读写集合。

支持(1) 反对(0) lucika.zh | 园豆:62 (初学一级) | 2014-03-06 14:19
0

这是一个很简单的对集合的并发访问问题。

Launcher | 园豆:45045 (高人七级) | 2014-03-06 09:30

感觉您说的好像很靠谱,我从来没用过线程和任务,但是我不明白我的界面为什么都没有了,然后在途中的这个位置抛异常啊?我都跟不到是哪个集合,我再试试

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 11:31

@qingyu1989: 

你把 Application.Run(new ManageMainForm()); try catch 起来,或者使用 UnhandledException 事件来捕获异常,然后就可以看到抛出异常的代码位置。

支持(1) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-06 11:34

@Launcher: 哥,我图中的位置抛出的异常,或者可能我不太理解您的抛出异常代码位置是指什么,一般不都应该是Foreach这样的地方抛异常么?能跟我细说说么?我加您QQ可以么?

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 14:32

@qingyu1989: 你截图那个 InvalidOperationException,你把它的 StackTrace 显示出来,你就能看到抛出异常的是哪个方法。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-06 14:38

@Launcher: stacktrace我找到了,但是以前没处理过类似的,有点看不懂,哥,我再不要脸一次,您帮我看看好么,谢谢您!

在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
在 System.Collections.Generic.List`1.Enumerator.MoveNextRare()
在 System.Collections.Generic.List`1.Enumerator.MoveNext()
在 GMap.NET.WindowsForms.GMapControl.OnMouseMove(MouseEventArgs e)
在 System.Windows.Forms.Control.WmMouseMove(Message& m)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
在 System.Windows.Forms.UserControl.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
在 System.Windows.Forms.Application.Run(Form mainForm) 在 CTTC_ITS_Manage.Program.Main() 位置 X:\\工程\\公交\\CTITS\\软件\\ITS_Project\\CTTC_ITS_Manage\\CTTC_ITS_Manage\\Program.cs:行号 25

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 15:46

@qingyu1989: 

在 GMap.NET.WindowsForms.GMapControl.OnMouseMove(MouseEventArgs e)

这是你的代码吗?如果是,那么你就可以看下你的实现了。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-06 16:04

@Launcher: 还真不是我写的,其实这些地方我看了,没有一个地方是我自己写的,我就是在主界面里写了一个task,就这样了,再后来改成Thread,还是这样,每当出现这个异常的时候,我的主界面就没有了,接受不了呀。。。哥,还是很谢谢你!!!

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 16:13

@qingyu1989: 我这么跟你说吧,OnMouseMove 里面是不是使用了一个 List<T> 类型的变量,找到这个变量,然后在你的 task 、thread 中也去找这个变量,然后把所有这些地方操作 List<T> 的代码都用 lock 保护起来。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-06 16:15
0

一个集合你一边在循环他,一边有又在操作修改,一旦修改集合里面元素的Index都改变了.

Dhoopu | 园豆:10 (初学一级) | 2014-03-06 10:56

都是这么说的,但是跟代码很费劲

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 11:32
0

楼主,这个DevExpress用的是哪个版本,破解了没有?

king2003 | 园豆:161 (初学一级) | 2014-03-06 11:13

破解了。。。。。。12.1吧,我忘了。。

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2014-03-06 11:29
0

亲,我也遇到您这个问题,后来您解决了吗?

学知行者 | 园豆:202 (菜鸟二级) | 2015-06-15 01:25

我也忘了怎么解决的,我记得就是把所有for改成foreach居然好了,这么久才回复,很抱歉

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2016-07-12 15:55

是把foreach改成for了,上边打错了

支持(0) 反对(0) qingyu1989 | 园豆:6 (初学一级) | 2016-07-12 15:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册