解决方案 »

  1.   

    死机的时候CPU\内存使用情况怎么样?
    最好是主程序写命令,让线程一个一个去执行,别让一个线程执行太久。
      

  2.   

    抛出异常时句柄数并不是特别多,上图MediaBuy程序就是本程序的
      

  3.   

    没有动态修改UI,仅仅在UI上显示一些进度信息
      

  4.   

    http://blog.sina.com.cn/s/blog_6ca907a60100lxar.html
    关闭数据执行保护(DEP)
      

  5.   


    应该不是数据执行保护的问题,这个异常每次抛出的信息都不一样,上面那张截图只是异常之一,面且是运行了10多个小时后才抛出来的,次数比较多的异常还是在这句代码中抛出:
      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
      

  6.   

    从Form1.Designer.cs文件中抛出的异常,不好捕获,捕获也了也没法解决
      

  7.   

    根据微软官方的说法,导致这个错误是由于Windows的保护机制,在编译后的exe的PE头部,有一个DEP(Data Execution Prevention)的功能。需要将这个功能关闭,就能正常运行了,试了试成功了。
      

  8.   

      webbrowser 控件经过 .net封装后,需要窗体来承载起容器,在原始的webbrowser 控件则不需要..
      

  9.   

    为什么会重复 new Form1呢?难道你是从子线程中去 new Form1吗?
      

  10.   

    怎么判断是重复new Form的?是看异常判断$this.Icon的值为null吗?也就是说new 了Form 但是没有设置相关的属性?
      

  11.   

    我猜他是在PublishForm中显示进度条,在Form1中抓数据,每次抓数据都会开启线程并初始化Form1,导致Form1的局部过多,无法初始化了。
      

  12.   


    我没有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中抛出异常
      

  13.   

    怎么判断是重复new Form的?是看异常判断$this.Icon的值为null吗?也就是说new 了Form 但是没有设置相关的属性?
    我没有重复new Form1
    $this.Icon的值不为null,这个只是异常之一,
      

  14.   


    不是这样的,我是在新开的线程中抓数据的Form1只是显示进度信息, 线程执行过程中并没有重新初始化Form1,我只开了一个线程,运行时间长后,异常会从Form1中抛出来,我也想不通是为什么
      

  15.   

    你那个exe程序不会是在调试模式下一直运行10个小时吧,20楼的截图显示你是通过调试模式运行的,那个显然不行。
      

  16.   

    就是因为发布版运行时间长了后总死掉,所以才让程序在调试模式下运行的,就是看在哪句代码会抛出异常,没想到是在Form1.Designer.cs文件中抛出来的,所以不知道问题所在
      

  17.   


    这是可能的,我看在程序执行过程中,所占内存一直在增大,可问题是这怎么解决呢,我就一个线程 循环执行任务,是不是要改成执行一次就关闭线程,再new 一个新线程执行?
      

  18.   

    你能不能给点Form1的代码,总觉得你初始化Form1的时候有问题。
      

  19.   

    根据你后面回帖的描述,强烈怀疑是句柄耗尽导致。
    每个进程最大可用句柄数大概是2W多,耗尽后常见的表象就是窗体无法正常打开句柄耗尽是多方面造成的,跨线程访问控件就是其中之一
    你可以做个试验写个循环一直调用控件的Invoke试试。
      

  20.   

    我想要在界面上显示线程工作的进度信息,除了调用控件的Invoke方法外,还有其它更好的办法吗?
      

  21.   

    Google搜索SynchronizationContext,那个是跨线程访问控件的好方法。如果再没用,你还是贴点代码吧,只要线程启动和回调部分的代码,核心部分是不需要的。
      

  22.   

    摸索了好几天,最后找了这段代码解决了问题: 
    #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