请问大佬。真是什么问题!!!为什么Chart也变成了红叉????Chart控件里面有集合的概念吗?
对chart的操作只有两种代码:
1: chartnum.Series[i].Points.AddXY
2:chartnum.Series[i].Points.Clear();
请问是什么问题导致软件出错??
问题出现在:
对控件Chart进行跨线程操作(非调试状态下,正常运行),在程序运行过程中,执行以下的跨线程函数:
private void Clear_series(Chart chartnum)
{
chartnum.Series[0].Points.Clear();
chartnum.Series[1].Points.Clear();
chartnum.Series[2].Points.Clear();
}
chart看出是一个集合,如果未对控件进行委托,则线程同时对这个Chart控件进行更改,就会报错“集合已修改,可能无法执行枚举操作”
因为报错是UI线程异常,所以考虑到了线程问题,再定位到了跨线程操作。
List等集合是非线程安全的。当你开了两个线程,一个往里面插入数据,一个foreach,就会发生这个问题。可以简单加锁处理
这个问题一定是和Foreach有关的嘛?
@😀明笔记: 类似需要遍历集合的都会有这个问题
@hahanonym: 那为什么datagridview会变红叉呢???集合和这个控件没有任何关系啊
@😀明笔记: 是不是绑定的itemsource
@hahanonym: 控件没有绑定数据,都是自己给数据直接画点的
@hahanonym: 不好意思,说错控件名了,不是datagridview是chart控件
最好能写个能复现问题的demo发上来看看
涉及多线程,问题是偶然性-,复现不了问题所在,现在就是想知道,能够出现这个问题的可能在哪?以及控件为什么会变红叉
@😀明笔记: 遍历时增加或删除集合中元素导致的
@会长: 控件变红叉是什么原因导致的呢??
@😀明笔记: 运行有错误就会显示×
@会长:
对chart的操作只有两种代码:
1: chartnum.Series[i].Points.AddXY
2:chartnum.Series[i].Points.Clear();
请问有什么可能性会导致出错吗?
@😀明笔记: 不知道哦,你试着注释掉一部分代码,看错误是否还存在,用排除法慢慢找问题吧,每次注释掉一半代码。$log_2^n$遍之内就能找到问题代码
@会长: 运行有错误。不是应该会报错的吗?这个是没有报错,直接变红叉的哦-
@😀明笔记: 那个弹出框不是报的错吗
@会长: 额。。好奇怪哦。操作Chart的控件里,没有相关的集合啊。那个集合报错是另外一个线程的。
能不能通过报错信息,知道Chart哪里出了问题?我看不懂这个报错
应该是一边修改一个集合,一边遍历,不一定是foreach,用linq了没?
没有
上面的大神关于为什么出现这个问题已经说得很清楚了,我来说一下为什么出现红x,
这是chart控件出错时的默认显示图片
你可以点击控件,f4,看一下控件属性,没记错的话是errorimage,可以在这里修改错误时显示什么图片
对chart的操作只有两种代码:
1: chartnum.Series[i].Points.AddXY
2:chartnum.Series[i].Points.Clear();
请问这两条代码,什么情况会出现错误呢??Chart控件出错的问题你遇到过有哪些?可以举例给我参考一下嘛?
@😀明笔记:
你看一下错误是在绘制曲线(Painting)时候报错的
在这期间他会用迭代器(enumerator)去迭代数据,此期间数据被改了就会报这个错误。
按楼上大神所说,多线程这两个操作加锁就可以保证每次只有一个线程去修改,去重绘,去迭代,
就没有问题了
@猝不及防: -没听懂哦,能否提供一下实现你的报错思路的简单代码实例???如果可以万分感激!!!!
我实在找不到怎么出错,而且现在很紧急!
@😀明笔记:
你模拟一下,开多个线程,每个线程一个循环体,每个循环体里面执行你上面两个方法(add和clear),你好像也提了很多这方面问题了,比较好奇你们公司没有一个大佬带带你吗?感觉老是这样对你的成长不太好
@猝不及防: 不会专门带,有问题就问,但是我想先通过自己的努力试着去解决
@😀明笔记: 嗯嗯,你试试
@猝不及防: -没有出现报错,呜呜呜惨咯
楼主有解决吗?我也出现这个情况了,应该怎么做啊
和楼主一样,遇到了相同的问题,楼主解决了吗
和楼主一样,遇到了相同的问题,楼主解决了吗?改了好几天,奔溃了