首页 新闻 会员 周边 捐助

C#集合已修改,可能无法执行枚举操作

0
悬赏园豆:50 [已解决问题] 解决于 2020-05-08 09:21

请问大佬。真是什么问题!!!为什么Chart也变成了红叉????Chart控件里面有集合的概念吗?
对chart的操作只有两种代码:
1: chartnum.Series[i].Points.AddXY
2:chartnum.Series[i].Points.Clear();
请问是什么问题导致软件出错??

C#
😀明笔记的主页 😀明笔记 | 初学一级 | 园豆:13
提问于:2020-05-06 14:49
< >
分享
最佳答案
0

问题出现在:
对控件Chart进行跨线程操作(非调试状态下,正常运行),在程序运行过程中,执行以下的跨线程函数:

    private void Clear_series(Chart chartnum)
    {
    chartnum.Series[0].Points.Clear();
    chartnum.Series[1].Points.Clear();
    chartnum.Series[2].Points.Clear();
    }

chart看出是一个集合,如果未对控件进行委托,则线程同时对这个Chart控件进行更改,就会报错“集合已修改,可能无法执行枚举操作”

😀明笔记 | 初学一级 |园豆:13 | 2020-05-08 09:08

因为报错是UI线程异常,所以考虑到了线程问题,再定位到了跨线程操作。

😀明笔记 | 园豆:13 (初学一级) | 2020-05-08 09:16
其他回答(7)
0

List等集合是非线程安全的。当你开了两个线程,一个往里面插入数据,一个foreach,就会发生这个问题。可以简单加锁处理

收获园豆:5
hahanonym | 园豆:1460 (小虾三级) | 2020-05-06 14:56

这个问题一定是和Foreach有关的嘛?

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:01

@😀明笔记: 类似需要遍历集合的都会有这个问题

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2020-05-06 15:03

@hahanonym: 那为什么datagridview会变红叉呢???集合和这个控件没有任何关系啊

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:11

@😀明笔记: 是不是绑定的itemsource

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2020-05-06 15:30

@hahanonym: 控件没有绑定数据,都是自己给数据直接画点的

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:31

@hahanonym: 不好意思,说错控件名了,不是datagridview是chart控件

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:48
1

最好能写个能复现问题的demo发上来看看

收获园豆:20
会长 | 园豆:12463 (专家六级) | 2020-05-06 15:05

涉及多线程,问题是偶然性-,复现不了问题所在,现在就是想知道,能够出现这个问题的可能在哪?以及控件为什么会变红叉

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:10

@😀明笔记: 遍历时增加或删除集合中元素导致的

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2020-05-06 15:17

@会长: 控件变红叉是什么原因导致的呢??

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:18

@😀明笔记: 运行有错误就会显示×

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2020-05-06 17:15

@会长:
对chart的操作只有两种代码:
1: chartnum.Series[i].Points.AddXY
2:chartnum.Series[i].Points.Clear();
请问有什么可能性会导致出错吗?

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 17:16

@😀明笔记: 不知道哦,你试着注释掉一部分代码,看错误是否还存在,用排除法慢慢找问题吧,每次注释掉一半代码。$log_2^n$遍之内就能找到问题代码

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2020-05-06 17:19

@会长: 运行有错误。不是应该会报错的吗?这个是没有报错,直接变红叉的哦-

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 17:22

@😀明笔记: 那个弹出框不是报的错吗

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2020-05-06 17:24

@会长: 额。。好奇怪哦。操作Chart的控件里,没有相关的集合啊。那个集合报错是另外一个线程的。
能不能通过报错信息,知道Chart哪里出了问题?我看不懂这个报错

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 17:27
0

应该是一边修改一个集合,一边遍历,不一定是foreach,用linq了没?

顾晓北 | 园豆:10898 (专家六级) | 2020-05-06 15:57

没有

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 15:58
1

上面的大神关于为什么出现这个问题已经说得很清楚了,我来说一下为什么出现红x,
这是chart控件出错时的默认显示图片
你可以点击控件,f4,看一下控件属性,没记错的话是errorimage,可以在这里修改错误时显示什么图片

收获园豆:25
猝不及防 | 园豆:2878 (老鸟四级) | 2020-05-06 16:50

对chart的操作只有两种代码:
1: chartnum.Series[i].Points.AddXY
2:chartnum.Series[i].Points.Clear();
请问这两条代码,什么情况会出现错误呢??Chart控件出错的问题你遇到过有哪些?可以举例给我参考一下嘛?

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 16:58

@😀明笔记:
你看一下错误是在绘制曲线(Painting)时候报错的
在这期间他会用迭代器(enumerator)去迭代数据,此期间数据被改了就会报这个错误。
按楼上大神所说,多线程这两个操作加锁就可以保证每次只有一个线程去修改,去重绘,去迭代,
就没有问题了

支持(0) 反对(0) 猝不及防 | 园豆:2878 (老鸟四级) | 2020-05-06 17:27

@猝不及防: -没听懂哦,能否提供一下实现你的报错思路的简单代码实例???如果可以万分感激!!!!
我实在找不到怎么出错,而且现在很紧急!

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-06 18:47

@😀明笔记:
你模拟一下,开多个线程,每个线程一个循环体,每个循环体里面执行你上面两个方法(add和clear),你好像也提了很多这方面问题了,比较好奇你们公司没有一个大佬带带你吗?感觉老是这样对你的成长不太好

支持(0) 反对(0) 猝不及防 | 园豆:2878 (老鸟四级) | 2020-05-07 09:08

@猝不及防: 不会专门带,有问题就问,但是我想先通过自己的努力试着去解决

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-07 09:11

@😀明笔记: 嗯嗯,你试试

支持(0) 反对(0) 猝不及防 | 园豆:2878 (老鸟四级) | 2020-05-07 09:14

@猝不及防: -没有出现报错,呜呜呜惨咯

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2020-05-07 10:34
0

楼主有解决吗?我也出现这个情况了,应该怎么做啊

sj1230 | 园豆:202 (菜鸟二级) | 2020-08-02 18:38
0

和楼主一样,遇到了相同的问题,楼主解决了吗

四十四 | 园豆:202 (菜鸟二级) | 2021-02-01 09:45
0

和楼主一样,遇到了相同的问题,楼主解决了吗?改了好几天,奔溃了

暴走的小优 | 园豆:202 (菜鸟二级) | 2023-08-10 11:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册