当前位置: 代码迷 >> C# >> C# winform 项目,封闭Form窗体时报错
  详细解决方案

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

热度:103   发布时间:2016-05-05 04:32:40.0
C# winform 项目,关闭Form窗体时报错
在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);  //代码走到这边报上面的错误
      
------解决思路----------------------
报错是因为线程没有正常退出,
使用Sleep(500)的是没有办法保证线程完全退出的
可以增加个标志位bExit,在线程退出时置为True
在exitThread = true;
之后使用while(1)死等逻辑,等待线程退出。

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


还有,在线程使用MessageBox不是个好习惯。
  相关解决方案