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

sxl_88 2015-03-09 10:46:27
在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);
}
}
...全文
1164 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-03-09
  • 打赏
  • 举报
回复
其实重点就是在form_closing事件里,通过代码判断bool变量,如果不想让它关闭,就执行e.Cancle=true; 就取消关闭了 你可以定义2个bool变量,一个表示用户点下了关闭(form_closing执行过),另一个表示timer里要求关闭了 那么timer里要先判断用户确实点下了关闭,在form_closing里要判断timer要求关闭才真正关闭 或者2个bool用1个int代替,0表示不关闭,也没有点下关闭.1表示点下了关闭,但不真正执行关闭,2表示执行关闭
sxl_88 2015-03-09
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
或者关闭窗口不要立即关闭,而采用延迟关闭 用bool变量标识窗口要求关闭 然后在timer执行的时候判断这个变量,如果要求关闭,就不要再启动线程,而是关闭窗口
这种方式,个人觉得挺好的。能不能再具体点,最好提供下代码看看。
bdmh 2015-03-09
  • 打赏
  • 举报
回复
不要再线程中访问ui控件,form关掉了,web销毁了,但是thread中还在访问,试试判断web是否为null,或者被disposed
於黾 2015-03-09
  • 打赏
  • 举报
回复
或者关闭窗口不要立即关闭,而采用延迟关闭 用bool变量标识窗口要求关闭 然后在timer执行的时候判断这个变量,如果要求关闭,就不要再启动线程,而是关闭窗口
於黾 2015-03-09
  • 打赏
  • 举报
回复
if (webBrowser1 != null && !webBrowser1.IsDisposed)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧