在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表示执行关闭