小弟在winform上加了个chart控件用来绘图,然后新建了一个线程来执行一段耗时操作,这个操作会得到我要显示的数据points[],用chart1.Invoke((MethodInvoker)delegate(){chart1.addXY(,);chart1.update();});调用了匿名方法来实现跨线程更新。最后执行完成后调用了Abort函数来退出新建的线程,结果就提示“由于代码已经过优化或者本机框架位于调用堆栈之上 无法计算表达式的值”的错误。
求达人指点迷津!!
PS:我希望实现的效果是执行完成后就退出线程,然后通过点击一个button再次新建线程执行相同操作,更新chart控件后退出线程。现在退不出来很无奈

解决方案 »

  1.   

    为啥要给主线程发个消息呢?我现在的情况是退不出来当前线程啊,
    try
    {
    Newthread.Abort();//这里会出现错误
    }
    catch(Exception err)//这里err就是提示“由于代码已经过优化或者本机框架位于调用堆栈之上 无法计算表达式的值”
    {
    Newthread.Abort();//这样倒是强制结束了不过再次调用就会有问题了,而且没有规律,不一定是第几次就崩溃了
    }
      

  2.   

    让主线程再开一个线程来中止newThread.原因: 1:你的nwqThread有类似chart1.Invoke的方式来调用主线程。
           2:如果处于Invoke状态时,再让主线程Abort newThread时就会出问题。因为此时的主线程已处于阻塞状态。
           3:建议:不用Invoke改用BeginInvoke或通过新的线程来执行Abort。
      

  3.   

    感谢回复!我也试过BeginInvoke异步调用也会出现问题Abort函数我是在newThread线程中调用的,自己来退出自己并没有在主线程里调用。应该是哪里的状态出问题了,就是没搞明白
      

  4.   

    catch (System.Threading.ThreadAbortException) { }
    这个放到你的cath只前就可以了
      

  5.   

    你的newThread里不需要Abort(),执行完了 它会自己释放被清理的
    如果在没有执行完毕你就想中断它的话 加上我上边的catch (System.Threading.ThreadAbortException) { }
    就行了
      

  6.   

    不行啊,还是有问题好像执行两三次的话UI线程就死掉了。我读取了一下线程的ID,第一次新建的线程ID是11,执行完退出后线程数量是减少了一个,不过第二次运行新建线程的话ID变成了12,不知道是不是没退干净啊,导致使用共享资源而冲突了?