大家好,我想问个关于C#里面多线程的问题哈,我在Form1上有个按钮,按了之后响应事件启动了一个线程(线程A),线程A要完成一些比较费时间的事,中间要实时生成Chart,和不断更新Chart,由于在一个线程上创建的控件不能成为另一个线程上创建的控件的父级,所以在生成Chart的时候我又要用到委托,委托给另一个函数去生成Chart(委托A),于是程序就经常出问题了,经常发生InvalidOperationException,提示“对象当前正在其他地方使用。”,下面的疑难提示写的是“如果在使用GetHdc方法后使用Graphics对象,请调用ReleaseHdc方法。”,我想问问这是怎么回事啊?首先,问题并不是线程A引起的,是加了委托之后才出现的,其次委托A是很短的一个小函数,而且我设了标记变量了,用来标记它是不是运行完了,它没运行完的时候线程A应该是不会往下运行的,那这到底是怎么回事呢,还是实时更新Chart的时候程序自己又生成新的线程了呢?

解决方案 »

  1.   

    我非常暴力的定位了一下出问题的地方,发现是在一句“thread.sleep(200);”,也就是说在这个线程A挂起的时候,程序应该是跑去运行UI了吧?是在运行UI的时候出的问题是吗?
      

  2.   

    嗯,我是这么做的啊,呵呵,把处理数据的逻辑放在主线程里了,更新控件的部分是放在委托里来实现的,我刚才又试了一下,之前是没有这个问题,可以正常的显示结果,但是我想把结果保存在pdf里面,这就要保存chart图表,就是每测完一组数据,就保存一个chart图表,于是在主线程里加了这句话“chart.SaveImage(string.Format("{0}.jpg", str_parameter), ChartImageFormat.Jpeg);”然后就有问题了,我是不是应该把这句话也放在委托里?
      

  3.   

    降低更新的频率,你上次更新未完成,使用的Graphics对象未来得及释放(也可能是因为被你加锁了导致无法释放),下次更新又要使用到它,因此报错。
      

  4.   

    目测是一个有点耗时的IO操作,放在后台线程中去,没必要放在UI线程中