今天在主界面里写了一个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());出了异常,但是代码还跟不出来,愁人。。。。
for里面,不要从0开始,而应该倒过来,从count-1开始
好像不管用
问题不是在这里,而是出现在集合的访问上。正如错误提示,集合已修改无法再枚举。
不要在foreach循环时修改集合元素,可以通过for方式访问并修改集合元素。
这个我也都考虑过,已经把foreach都换成for了
@qingyu1989: 如果多线程的话,可以采用加锁的方式,确保同一时刻只有一个线程在读写集合。
这是一个很简单的对集合的并发访问问题。
感觉您说的好像很靠谱,我从来没用过线程和任务,但是我不明白我的界面为什么都没有了,然后在途中的这个位置抛异常啊?我都跟不到是哪个集合,我再试试
@qingyu1989:
你把 Application.Run(new ManageMainForm()); try catch 起来,或者使用 UnhandledException 事件来捕获异常,然后就可以看到抛出异常的代码位置。
@Launcher: 哥,我图中的位置抛出的异常,或者可能我不太理解您的抛出异常代码位置是指什么,一般不都应该是Foreach这样的地方抛异常么?能跟我细说说么?我加您QQ可以么?
@qingyu1989: 你截图那个 InvalidOperationException,你把它的 StackTrace 显示出来,你就能看到抛出异常的是哪个方法。
@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
@qingyu1989:
在 GMap.NET.WindowsForms.GMapControl.OnMouseMove(MouseEventArgs e)
这是你的代码吗?如果是,那么你就可以看下你的实现了。
@Launcher: 还真不是我写的,其实这些地方我看了,没有一个地方是我自己写的,我就是在主界面里写了一个task,就这样了,再后来改成Thread,还是这样,每当出现这个异常的时候,我的主界面就没有了,接受不了呀。。。哥,还是很谢谢你!!!
@qingyu1989: 我这么跟你说吧,OnMouseMove 里面是不是使用了一个 List<T> 类型的变量,找到这个变量,然后在你的 task 、thread 中也去找这个变量,然后把所有这些地方操作 List<T> 的代码都用 lock 保护起来。
一个集合你一边在循环他,一边有又在操作修改,一旦修改集合里面元素的Index都改变了.
都是这么说的,但是跟代码很费劲
楼主,这个DevExpress用的是哪个版本,破解了没有?
破解了。。。。。。12.1吧,我忘了。。
亲,我也遇到您这个问题,后来您解决了吗?
我也忘了怎么解决的,我记得就是把所有for改成foreach居然好了,这么久才回复,很抱歉
是把foreach改成for了,上边打错了