【问题标题】:stackoverflow exception c# [closed]c#stackoverflow异常[关闭]
【发布时间】:2016-04-02 00:08:30
【问题描述】:

当我尝试这段代码时,我得到了一个 stackoverflow 异常:

Thread Tcheck= new Thread(checkbr);
Tcheck.Start();

private void checkbr() 
{
    try
    {
        var RunningProcessPaths = ProcessFileNameFinderClass.GetAllRunningProcessFilePaths();
        if (RunningProcessPaths.Contains("chrome.exe"))
        {
            checkbr();
        }
        else
        {
            System.Threading.Thread.Sleep(500);
            // TO START NEW INSTANCE OF APP
            System.Diagnostics.Process.Start(Application.ExecutablePath);
            Thread.Sleep(500);
            Process.GetCurrentProcess().Kill();
        }
    }
    catch (Exception)
    {
        checkbr();
    }
}

我想知道如何清空这个应用的物理内存 因为当我在任务管理器中检查我的应用时,我发现它正在疯狂地增加使用的内存。

【问题讨论】:

  • 你想做什么?
  • 我只是想知道浏览器是否打开,如果它打开了,它仍然是打开还是关闭。

标签: c# multithreading stack overflow


【解决方案1】:

我不是 C# 专家,但似乎 checkbr() 方法会递归调用自身,以防 chrome 正在运行。
这肯定会导致堆栈溢出。

【讨论】:

  • 是的,我知道,但我不知道修复它并结束循环并用新鲜记忆清楚地重新开始的最佳方法
【解决方案2】:

如果您只想检查进程是否正在运行,最好让while 循环不断运行。这样您就不会每次都增加调用堆栈。

private void checkbr() 
{
    try
    {
        while (true) 
        {
            var RunningProcessPaths = ProcessFileNameFinderClass.GetAllRunningProcessFilePaths();
            if (RunningProcessPaths.Contains("chrome.exe"))
            {   
                Thread.Sleep(5000);
            }
            else
            {             
                System.Threading.Thread.Sleep(500);
                // TO START NEW INSTANCE OF APP
                System.Diagnostics.Process.Start(Application.ExecutablePath);
                Thread.Sleep(500);
                Process.GetCurrentProcess().Kill();
            }
        }            
    }
    catch (Exception)
    {
    }
}

这样,你只是在做一些事情是进程没有在运行,否则只需等待几秒钟,循环就会重新启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多