C# winform 项目,关闭Form窗体时报错

sxl_88 2015-03-16 01:35:16
在C# winform 项目中,在关闭form窗体时导致报错,
提示:试图释放正在使用的 RCW。活动线程或其他线程上正在使用该 RCW。释放正在使用的 RCW 的尝试会导致损坏或数据丢失。

请帮忙看看代码这么修改下,谢谢!

代码如下:


bool exitThread = false; //线程退出标记
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()
{

if (!exitThread)
{
System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(doWork));
thread.Start();
}

}


void doWork()
{
try
{
if (!exitThread)
{
System.Threading.Thread.Sleep(500);

if (webBrowser1 != null)
{
webBrowser1.Navigate(reporturl);
}
}

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void FrmAnalysis_FormClosing(object sender, FormClosingEventArgs e)
{
exitThread = true;
System.Threading.Thread.Sleep(500);

frmmess.Close();
}


protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing); //代码走到这边报上面的错误
...全文
424 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
feifei鱼 2015-03-16
  • 打赏
  • 举报
回复
死锁了,应该是
sxl_88 2015-03-16
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
报错是因为线程没有正常退出, 使用Sleep(500)的是没有办法保证线程完全退出的 可以增加个标志位bExit,在线程退出时置为True 在exitThread = true; 之后使用while(1)死等逻辑,等待线程退出。

exitThread = true;
while(!bExit)
{
Sleep(10);
}

还有,在线程使用MessageBox不是个好习惯。
bool bExit = false; void doWork() { try { if (!exitThread) { System.Threading.Thread.Sleep(500); if (webBrowser1 != null) { webBrowser1.Navigate(reporturl); } } else { bool bExit = true; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void FrmAnalysis_FormClosing(object sender, FormClosingEventArgs e) { exitThread = true; while(!bExit) { System.Threading.Thread.Sleep(10); } frmmess.Close(); } 是这样写,对吗? 还有原先代码中已经有exitThread变量来标识退出线程标记了,为什么还要增加一个bExit变量来标识呀?
xian_wwq 2015-03-16
  • 打赏
  • 举报
回复
报错是因为线程没有正常退出, 使用Sleep(500)的是没有办法保证线程完全退出的 可以增加个标志位bExit,在线程退出时置为True 在exitThread = true; 之后使用while(1)死等逻辑,等待线程退出。

exitThread = true;
while(!bExit)
{
Sleep(10);
}

还有,在线程使用MessageBox不是个好习惯。
於黾 2015-03-16
  • 打赏
  • 举报
回复
为什么要重写Dispose方法??

110,534

社区成员

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

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

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