程序假死是怎么回事?

独孤大虾 2004-06-12 02:55:50
我写了一个Windows的应用程序,由一个主窗体和几个自定义的控件构成,控件是动态加载的,每次点击切换时用如下代码:
this.pnlMain.Controls.Clear();
StudentView _studentView = new StudentView(_ds);
this.pnlMain.Controls.Add(_studentView);

但是我发现,这样来回切换了若干次之后,程序就会停止相应用户交互,一点击窗体就会变灰没有任何反应,但是程序没有死掉,因为还可以通过在任务栏上单击右键选择关闭的方式关掉它,这是怎么回事呢?
...全文
318 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gbliang 2004-06-16
  • 打赏
  • 举报
回复
没有释放自愿吧,我曾经做过一个生成word的程序,当时就是由于没有及时释放,后来就报错,打开任务管理器一看,好多个进程。
elite2018 2004-06-15
  • 打赏
  • 举报
回复
agree with litp
李天平 2004-06-15
  • 打赏
  • 举报
回复
放在另个线程来运行

创建多线程应用程序

 在.NET和C#中编写一个多线程应用程序将非常得容易。即使对于那些从没有用C#编写过多线程应用程序的初学者,只需遵循以下这些简单的步骤就可以实现目的。

定义名称空间
  在.NET中,多线程功能是在System.Threading名称空间中定义的。
using System.Threading;

启动线程
  System.threading名称空间中的Thread类代表一个线程对象,用这个类对象可以创建新的线程,删除、暂停和恢复线程。

下面的代码使用Thread类创建一个新的线程,然后启动这个线程:

Thread mythread ;

mythread = new Thread(new ThreadStart( WriteData ));
mythread.Start();

其中WriteData是这个线程要执行的一个函数,代码如下:
protected void WriteData(){
 string str ;
 for ( int i = 0; i<=10000; i++ ){
  str = "Secondary Thread" + i.ToString();
  Console.WriteLine(listView1.ListItems.Count, str, 0, new string[]{""} );
  Update();
 }
}

杀死线程
  Thread类的Abort方法用于永久地杀死一个线程。但是请注意,在调用Abort方法前一定要判断线程是否还激活,:
if ( mythread.IsAlive )
{
  mythread.Abort();
}


johnczy 2004-06-14
  • 打赏
  • 举报
回复
不知道为什么改成全局变量会好。但我想你应先把控件从Form中去除后再Dispose
试一下这个:
if (this.pnlMain.Controls.Count > 0 && this.pnlMain.Controls[0] != null)
Control ctrl = this.pnlMain.Controls[0];
this.pnlMain.Controls.Remove(0);
ctrl.Dispose();
ExamView _examView = new ExamView(_ds);
this.pnlMain.Controls.Add(_examView);
huangsuipeng 2004-06-12
  • 打赏
  • 举报
回复
都指向HEAP同一个地址
独孤大虾 2004-06-12
  • 打赏
  • 举报
回复
我这几个控件的声明从局部变量提升为窗体级变量,这个错误就没有了,这是怎么回事呢?
lehehe 2004-06-12
  • 打赏
  • 举报
回复
难道只有在最小化然后还原的时候才会出现这个错误!!???
如果是这样的化,那么还需要调整算法,因为最小化后程序会释放掉资源,回复的化他会重新构造对象,这样的化就会产生提到的异常!!应该在最小化的时候添加事件处理,保持最小化之前的状态,然后回复的时候同样进行处理,回复原来的状态!!
lehehe 2004-06-12
  • 打赏
  • 举报
回复
内存耗尽了!!应该使用dispose方法主动释放资源!!!
独孤大虾 2004-06-12
  • 打赏
  • 举报
回复
我照您说的方法修改了程序,如下:
if (this.pnlMain.Controls.Count > 0 && this.pnlMain.Controls[0] != null)
this.pnlMain.Controls[0].Dispose();
this.pnlMain.Controls.Clear();
ExamView _examView = new ExamView(_ds);
this.pnlMain.Controls.Add(_examView);

但是在程序最小化后再还原时就会出现如下错误,是怎么回事呢:

未处理的“System.ObjectDisposedException”类型的异常出现在 system.windows.forms.dll 中。

其他信息: 无法访问名为“Panel”的已处置对象。
zhy0101 2004-06-12
  • 打赏
  • 举报
回复
是不是自定义控件在清除时没有及时释放资源,导致多次添加后控件等待资源
whizstorm 2004-06-12
  • 打赏
  • 举报
回复
Up

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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