Code Bye

C# winForm 窗体关闭前的线程处理

最近给客户做指挥调度系统,遇到个棘手的问题,请万能的坛友指条明路。问题是这样的,怕本人语言表达能力有限,先上图
private void DrawCarToMap()
{
     while(run)
     {
         取队列数据;
         brower.Document.InvokeScript(gpsData)//执行浏览器的脚本向地图画轨迹
         Thread.Sleep(500);
     }
}
private void GPS_Event(GPSEventArgs gpsData)
{
      压数据到队列
}
private void window_closeing()
{
      run = false;
      GPS_Event解绑; 
     try{
      DrawMap.Abort(); 
     }catch{}
}

问题就出在窗口关闭时经常引起整个程序崩溃,怀疑是正好关闭时浏览器正在执行脚本,或是正好在执行这一步brower.Document.InvokeScript(gpsData)对已经销毁的资源访问引起程序崩溃。由于本系统要7*24小时不间断运行,并有呼叫中心功能。请高手支招,万分感谢。这问题困扰很久了

解决方案

20

那就在关闭前执行browser.Stop()  或browser.Navigate(“about blank”)

10

假如有线程,把线程设置为后台线程。具体错误查不到?

10

退出窗口之前,等待其他工作线程退出后再退出主线程

10

判断browser != null && !browser.IsDisposed再执行后面

10

什么叫做“日志记不到”?你是怎么记录日志的?

15

引用 10 楼 zhaoxiuyong 的回复:

做了这一步判断只能减少出现的次数,也有极少情况出现闪退。刚才执行了判断后对象销毁了

你假如在线程里执行while,可以在关闭时候用thread.Join方法等待线程结束,也就是run = false;后循环退出后再执行closing的后续代码

10

你可以在程序退出时,等待正在运行的线程退出,方法甚至可以是简单的sleep,只要你sleep的时间超过等待线程退出的时间即可,界面上可以进行提示,正在等待线程退出,这样虽说退出的时候程序显得慢一点,但是不会崩溃。

5

要么加循环或计时器 判断线程状态再进行线程abort

10

禁用CheckForIllegalCrossThreadCalls只是把线程里访问Windows Forms控件这个bug的检查禁用而已,不是说这个bug就不存在了。
你的脚本执行代码应该在UI线程。从Winforms到ActiveX到脚本引擎,没有一层是线程安全的。

5

别用webbrowser了。 用第三方的如。 chrome内核。

5

while(run)
{
取队列数据;
brower.Document.InvokeScript(gpsData)//执行浏览器的脚本向地图画轨迹
Thread.Sleep(500);
}
画轨迹,单独开一个线程,试一试

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# winForm 窗体关闭前的线程处理