当前位置: 代码迷 >> C# >> C# winform 项目,无法访问已释放的对象。对象名:"WebBrowser"解决方法
  详细解决方案

C# winform 项目,无法访问已释放的对象。对象名:"WebBrowser"解决方法

热度:33   发布时间:2016-05-05 04:38:04.0
C# winform 项目,无法访问已释放的对象。对象名:"WebBrowser"
在C# winform 项目中,在关闭窗体时导致WebBrowser报错,提示:无法访问已释放的对象。对象名:"WebBrowser"。


请帮忙看看代码这么修改下,谢谢!
代码如下:
        private void FrmAnalysis_Load(object sender, EventArgs e)
        {

            timer = new System.Threading.Timer(MyTimerCallback, null, 0, 1000);
        }

       void MyTimerCallback(object o)
        {
            try
            {
                   //防止在窗口句柄初始化之前就走到下面的代码
                    if (this.IsHandleCreated == true)
                    {
                        TheadPackage();
                     }
            }
            catch
            {
            }
        }


        void TheadPackage()
        {
            System.Threading.Thread thread = new System.Threading.Thread(
                   new System.Threading.ThreadStart(doWork));
            thread.Start();
        }



       void doWork()
        {
            try
            {
                System.Threading.Thread.Sleep(500);
                
                if (webBrowser1 != null)
                {
                    webBrowser1.Navigate(reporturl);    //代码走到这边报上面的错误
                }
               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
------解决思路----------------------
if (webBrowser1 != null && !webBrowser1.IsDisposed)
------解决思路----------------------
或者关闭窗口不要立即关闭,而采用延迟关闭
用bool变量标识窗口要求关闭
然后在timer执行的时候判断这个变量,如果要求关闭,就不要再启动线程,而是关闭窗口
------解决思路----------------------
不要再线程中访问ui控件,form关掉了,web销毁了,但是thread中还在访问,试试判断web是否为null,或者被disposed
------解决思路----------------------
其实重点就是在form_closing事件里,通过代码判断bool变量,如果不想让它关闭,就执行e.Cancle=true;
就取消关闭了

你可以定义2个bool变量,一个表示用户点下了关闭(form_closing执行过),另一个表示timer里要求关闭了
那么timer里要先判断用户确实点下了关闭,在form_closing里要判断timer要求关闭才真正关闭

或者2个bool用1个int代替,0表示不关闭,也没有点下关闭.1表示点下了关闭,但不真正执行关闭,2表示执行关闭
  相关解决方案