Утечки памяти CSharpScript в APi ядра ASP.NET - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть API ядра ASP.Маршрут может выполнить несколько сценариев 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;
    }

Этот код приводит меня к утечкам памяти ипользователь не может повторить эти запросы.

Из моих предыдущих поисков я получил некоторую информацию в качестве моего класса FormContext для определения местоположения в другом проекте.Поэтому я поместил его в модельный проект вне моего API-проекта.Но у меня все еще есть эта проблема.

Я попробовал несколько способов выполнить мой сценарий (например, с помощью CSharpScript.Create или CSharpScript.EvaluateAsync), но память все еще не освобождена.

Я также слышал о классе AppDomain для выполнения моего скрипта в песочнице и освобождения памяти после использования, но AppDomain больше не используется в ASP.NET Core.

Спасибо за помощь;)

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Почему вы, ребята, так нервничаете? Выгрузка сборок / типов НЕ поддерживается в DotNet Core и не будет до 3.0.

Я работаю над CMS / VFS для DotNet Core, и это единственное серьезное препятствие на данный момент.

0 голосов
/ 19 ноября 2018

Хорошо, я нашел исправление:

                finally
                {
                    GC.Collect();
                }

Объем памяти уменьшится с более чем 1 ГБ до 250 МГ. Я знаю, что как только тип или сборка загружены, их больше нельзя выгружать, но формулы очень малы, поэтому я полагаю, что моя память была заполнена из-за процесса компиляции CSharpScript.

Сейчас я жду возможности выгрузить сборки, чтобы окончательно очистить это. Видимо, планируется: https://github.com/dotnet/coreclr/issues/552

Спасибо Тсенгу за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...