繁体   English   中英

ASP.NET核心APi中的CSharpScript内存泄漏

[英]CSharpScript memory leaks in ASP.NET core APi

我有一个ASP核心API。 一条路由可以从数据库中执行几个c#脚本,以在相同的上下文/全局变量上获得一些计算结果。

所以我有这段代码:

    public static async Task<FormulaEvalException> TryEvalAsync<T>(this T formulaContext) where T : FormulaContext
    {
        FormulaEvalException res = null;
        ScriptState state = null;
        var scriptOptions = ScriptOptions.Default.WithReferences("System", "System.Linq", "System.Globalization", "Microsoft.CSharp").WithImports(new[] { "System", "System.Linq", "System.Math", "System.Globalization", "System.Collections.Generic" });
        foreach (var formulaList in formulaContext.AllFormulas.Values)
        {
            foreach (var formula in formulaList)
            {
                formulaContext.CurrentFormula = formula;
                try
                {
                    if (state == null)
                    {
                        state = await CSharpScript.RunAsync(formula.Script, scriptOptions, formulaContext);
                    }
                    else
                    {
                        state = await state.ContinueWithAsync(formula.Script);
                    }
                    var result = state.ReturnValue;
                    if (result == null)
                    {
                        if (res == null)
                        {
                            res = new FormulaEvalException(formula.Title + " : No result");
                        }
                        continue;
                    }

                    formula.Result = result;
                }
                catch (CompilationErrorException ex)
                {
                    if (res == null)
                    {
                        res = new FormulaEvalException(formula.Title + ex.Message);
                    }
                    continue;
                }
                catch
                {
                    continue;
                }
            }
        }

        return res;
    }

此代码导致我内存泄漏,用户无法重复这些请求。

从以前的搜索中,我得到了一些信息,作为我的FormulaContext类与位于另一个项目中有关。 因此,我将其放在API项目之外的模型项目中。 但是我仍然有这个问题。

我尝试了几种执行脚本的方法(例如,使用CSharpScript.Create或CSharpScript.EvaluateAsync),但是仍然没有释放内存。

我还听说了AppDomain类,可以在使用后在沙箱中执行脚本并释放内存,但在ASP.NET Core中不再使用AppDomain。

谢谢你的帮助 ;)

好的,我找到了解决方法:

                finally
                {
                    GC.Collect();
                }

内存从1 GB以上降至250 MG。 我知道,一旦加载了类型或程序集,就无法再将其卸载,但是公式很小,因此我想由于CSharpScript的编译过程,我的内存已满。

我现在正在等待卸载程序集的能力,以彻底清理该程序集。 显然是有计划的: https : //github.com/dotnet/coreclr/issues/552

感谢曾先生的帮助。

你们为什么要跳这么多。 DotNet Core不支持程序集/类型的卸载,并且直到3.0才会卸载。

我正在为DotNet Core开发CMS / VFS,这是目前最大的障碍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM