Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# while循环中的内存泄漏_C#_Memory Management_While Loop - Fatal编程技术网

C# while循环中的内存泄漏

C# while循环中的内存泄漏,c#,memory-management,while-loop,C#,Memory Management,While Loop,我在while循环中运行一些代码,以确保程序始终在运行。如果程序未运行,则启动程序;如果程序未运行,则从备份中复制程序,然后启动程序,没有什么特别之处: while (true) { Process backup = new Process(); ProcessStartInfo check = new ProcessStartInfo(file); if (Process.GetProcessesByName(file).Length == 0) {

我在while循环中运行一些代码,以确保程序始终在运行。如果程序未运行,则启动程序;如果程序未运行,则从备份中复制程序,然后启动程序,没有什么特别之处:

while (true)
{
    Process backup = new Process();
    ProcessStartInfo check = new ProcessStartInfo(file);
    if (Process.GetProcessesByName(file).Length == 0)
    {
        if(File.Exists(file))
        {
            backup.StartInfo = check;
            backup.Start();
        }
        else if (!File.Exists(file))
        {
            File.Copy(backupFile, file);
            Thread.Sleep(250);
            backup.StartInfo = check;
            backup.Start();
        }
    }
    backup.Close();
    Thread.Sleep(2000);
}
问题是,在每个周期之后,ram的使用量都会增加大约100KB,这我知道的不多,但如果运行一个小时左右,就会导致大问题

我尝试过暂停它并在过程中使用
.Close()
,但没有乐趣。任何想法都非常感谢

  • 将这些行放在if语句中,以便除非进程未运行,否则不会执行这些行:

    Process backup = new Process();
    ProcessStartInfo check = new ProcessStartInfo(file);
    
  • 由于
    Process
    实现了
    IDisposable
    ,所以可以按照Oded的建议,将其封装在using语句中

  • 您没有实际的内存泄漏。当垃圾收集器运行时,内存将被回收。如果临时内存使用是一个问题,您可以强制GC运行,但我认为一旦您这样做,1您也不会有临时内存使用的问题


  • 您发布的代码中没有内存泄漏

    您可以尝试使用

    System.GC.Collect();
    
    请注意,这通常被认为是糟糕的设计,因此只有在绝对需要控制正在使用的RAM量的情况下才应该使用它。
    在任何情况下,如果您有如此严格的资源需求,C#可能不是首选语言。

    正如人们所说的,您实际上没有内存泄漏(至少看起来没有)

    但您可以做的是将初始化放在其他位置,您通常会在不需要的时候初始化备份和检查

    while (true)
    {
        Process backup;
        ProcessStartInfo check;
        if (Process.GetProcessesByName(file).Length == 0)
        {
            check = new ProcessStartInfo(file);//moved init
            backup = new Process();//moved init
            if(File.Exists(file))
            {
                backup.StartInfo = check;
                backup.Start();
            }
            else if (!File.Exists(file))
            {
                File.Copy(backupFile, file);
                Thread.Sleep(250);
                backup.StartInfo = check;
                backup.Start();
            }
        }
        backup.Close();
        Thread.Sleep(2000);
    }
    

    我也有同样的问题,所以我用了这个:

    [DllImport(“KERNEL32.DLL”,EntryPoint=“SetProcessWorkingSetSize”,SetLastError=true,CallingConvention=CallingConvention.StdCall)]
    内部静态外部布尔SetProcessWorkingSetSize(IntPtr pProcess、int dwMinimumWorkingSetSize、int dwMaximumWorkingSetSize);
    [DllImport(“KERNEL32.DLL”,EntryPoint=“GetCurrentProcess”,SetLastError=true,CallingConvention=CallingConvention.StdCall)]
    内部静态外部IntPtr GetCurrentProcess();
    

    调用这些方法,内存将被释放。

    看!,我只是检查了所有的选项,但什么都没有。另一方面,我解决了你的问题。创建一个新线程,设置它的ApartmentState=STA,然后将代码放入要在此新线程上执行的while中。使用它,您将确保在线程销毁后释放所有资源。我测试了它,它工作了

    是什么让你认为内存泄漏?您是否已等待GC进行收集,以查看是否无法收集某些数据(从而导致实际内存泄漏)?您实际上是在第5行中使用字符串文字还是输入错误?您应该在
    using
    语句中使用
    包装
    进程
    的创建。@ken2k我需要等待GC收集多长时间?在if语句中移动进程和进程StartInfo声明以及Close()是否解决了您的问题?似乎没有必要在不需要的时候分配它们。强烈反对。在大多数情况下,您不应该要求GC显式收集(实际上99%的时间)。是的,下一个循环将使上一个实例化超出范围,内存悬空,无论如何,它应该是GCed的。我完全同意,并且OPs代码中没有“内存泄漏”(如上所述),但是,如果OP如此关注每2秒100k的增量,他们可以自己调用GC。我只是在1%的情况下提供了此选项,例如资源不足的环境。您还应该将变量的声明移到更接近其实际使用情况的位置。问题是备份是在if条件之外引用的,如果我可以移动检查的话。