У меня есть 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.
Спасибо за помощь;)