C# winform为什么界面总死掉? c#winform线程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 死机的时候CPU\内存使用情况怎么样?最好是主程序写命令,让线程一个一个去执行,别让一个线程执行太久。 抛出异常时句柄数并不是特别多,上图MediaBuy程序就是本程序的 没有动态修改UI,仅仅在UI上显示一些进度信息 http://blog.sina.com.cn/s/blog_6ca907a60100lxar.html关闭数据执行保护(DEP) 应该不是数据执行保护的问题,这个异常每次抛出的信息都不一样,上面那张截图只是异常之一,面且是运行了10多个小时后才抛出来的,次数比较多的异常还是在这句代码中抛出: this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 从Form1.Designer.cs文件中抛出的异常,不好捕获,捕获也了也没法解决 根据微软官方的说法,导致这个错误是由于Windows的保护机制,在编译后的exe的PE头部,有一个DEP(Data Execution Prevention)的功能。需要将这个功能关闭,就能正常运行了,试了试成功了。 webbrowser 控件经过 .net封装后,需要窗体来承载起容器,在原始的webbrowser 控件则不需要.. 为什么会重复 new Form1呢?难道你是从子线程中去 new Form1吗? 怎么判断是重复new Form的?是看异常判断$this.Icon的值为null吗?也就是说new 了Form 但是没有设置相关的属性? 我猜他是在PublishForm中显示进度条,在Form1中抓数据,每次抓数据都会开启线程并初始化Form1,导致Form1的局部过多,无法初始化了。 我没有new Form1, 只是为了在Form1上能显示线程执行的情况,我把Form1的用this变量的方式传递到一个类的实例中,[code=csharp]clsTask cTask = new clsTask(); cTask.paraList.Add(account); string title = row.Cells["Title"].Value.ToString(); cTask.paraList.Add(title); cTask.paraList.Add(this); cTask.paraList.Add(ai++); [code]在线程的执行函数里,通过调用Form1中的委托函数来在Fom1中显示信息, 这样编译运行都是没问题的,只是运行超过10个小时后才会从Form1.Designer.cs中抛出异常 怎么判断是重复new Form的?是看异常判断$this.Icon的值为null吗?也就是说new 了Form 但是没有设置相关的属性?我没有重复new Form1$this.Icon的值不为null,这个只是异常之一, 不是这样的,我是在新开的线程中抓数据的Form1只是显示进度信息, 线程执行过程中并没有重新初始化Form1,我只开了一个线程,运行时间长后,异常会从Form1中抛出来,我也想不通是为什么 你那个exe程序不会是在调试模式下一直运行10个小时吧,20楼的截图显示你是通过调试模式运行的,那个显然不行。 就是因为发布版运行时间长了后总死掉,所以才让程序在调试模式下运行的,就是看在哪句代码会抛出异常,没想到是在Form1.Designer.cs文件中抛出来的,所以不知道问题所在 这是可能的,我看在程序执行过程中,所占内存一直在增大,可问题是这怎么解决呢,我就一个线程 循环执行任务,是不是要改成执行一次就关闭线程,再new 一个新线程执行? 你能不能给点Form1的代码,总觉得你初始化Form1的时候有问题。 根据你后面回帖的描述,强烈怀疑是句柄耗尽导致。每个进程最大可用句柄数大概是2W多,耗尽后常见的表象就是窗体无法正常打开句柄耗尽是多方面造成的,跨线程访问控件就是其中之一你可以做个试验写个循环一直调用控件的Invoke试试。 我想要在界面上显示线程工作的进度信息,除了调用控件的Invoke方法外,还有其它更好的办法吗? Google搜索SynchronizationContext,那个是跨线程访问控件的好方法。如果再没用,你还是贴点代码吧,只要线程启动和回调部分的代码,核心部分是不需要的。 摸索了好几天,最后找了这段代码解决了问题: #region 内存回收[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);/// <summary>/// 释放内存/// </summary>public static void ClearMemory(){GC.Collect();GC.WaitForPendingFinalizers();if (Environment.OSVersion.Platform == PlatformID.Win32NT){App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);}}#endregion 求一个网上不知道怎么问的算法 windows2008下获取不到DocumentCompleted c#的udp连接无法连接,接收不到数据! 用dataset填充datagridview,清空datagridview问题 DataList如何把编号加到前面 子窗体显示和传值问题. WebForm C# 两个 DataTable 对比删除重复? 请教,在ERP软件中将每一个单据(如入仓单)定义成一个类合理吗? C# winform软件注册 在pos系统中,什么时候产生产生单号合适? 请问如何比较两种颜色是一样的? 联合查询语句求解
最好是主程序写命令,让线程一个一个去执行,别让一个线程执行太久。
关闭数据执行保护(DEP)
应该不是数据执行保护的问题,这个异常每次抛出的信息都不一样,上面那张截图只是异常之一,面且是运行了10多个小时后才抛出来的,次数比较多的异常还是在这句代码中抛出:
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
我没有new Form1, 只是为了在Form1上能显示线程执行的情况,我把Form1的用this变量的方式传递到一个类的实例中,[code=csharp]clsTask cTask = new clsTask();
cTask.paraList.Add(account);
string title = row.Cells["Title"].Value.ToString();
cTask.paraList.Add(title);
cTask.paraList.Add(this);
cTask.paraList.Add(ai++);
[code]
在线程的执行函数里,通过调用Form1中的委托函数来在Fom1中显示信息, 这样编译运行都是没问题的,只是运行超过10个小时后才会从Form1.Designer.cs中抛出异常
我没有重复new Form1
$this.Icon的值不为null,这个只是异常之一,
不是这样的,我是在新开的线程中抓数据的Form1只是显示进度信息, 线程执行过程中并没有重新初始化Form1,我只开了一个线程,运行时间长后,异常会从Form1中抛出来,我也想不通是为什么
这是可能的,我看在程序执行过程中,所占内存一直在增大,可问题是这怎么解决呢,我就一个线程 循环执行任务,是不是要改成执行一次就关闭线程,再new 一个新线程执行?
每个进程最大可用句柄数大概是2W多,耗尽后常见的表象就是窗体无法正常打开句柄耗尽是多方面造成的,跨线程访问控件就是其中之一
你可以做个试验写个循环一直调用控件的Invoke试试。
#region 内存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion