最近给客户做指挥调度系统,遇到个棘手的问题,请万能的坛友指条明路。问题是这样的,怕本人语言表达能力有限,先上图
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
你假如在线程里执行while,可以在关闭时候用thread.Join方法等待线程结束,也就是run = false;后循环退出后再执行closing的后续代码
10
你可以在程序退出时,等待正在运行的线程退出,方法甚至可以是简单的sleep,只要你sleep的时间超过等待线程退出的时间即可,界面上可以进行提示,正在等待线程退出,这样虽说退出的时候程序显得慢一点,但是不会崩溃。
5
要么加循环或计时器 判断线程状态再进行线程abort
10
禁用CheckForIllegalCrossThreadCalls只是把线程里访问Windows Forms控件这个bug的检查禁用而已,不是说这个bug就不存在了。
你的脚本执行代码应该在UI线程。从Winforms到ActiveX到脚本引擎,没有一层是线程安全的。
你的脚本执行代码应该在UI线程。从Winforms到ActiveX到脚本引擎,没有一层是线程安全的。
5
别用webbrowser了。 用第三方的如。 chrome内核。
5
while(run)
{
取队列数据;
brower.Document.InvokeScript(gpsData)//执行浏览器的脚本向地图画轨迹
Thread.Sleep(500);
}
画轨迹,单独开一个线程,试一试
{
取队列数据;
brower.Document.InvokeScript(gpsData)//执行浏览器的脚本向地图画轨迹
Thread.Sleep(500);
}
画轨迹,单独开一个线程,试一试