Маршрут может выполнять несколько сценариев C# из базы данных, чтобы получить некоторые рассчитанные результаты в одном и том же контексте/глобальных значениях.
Итак, у меня есть этот код:
Код: Выделить всё
public static async Task TryEvalAsync(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, позволяющем выполнять мой сценарий в песочнице и освобождать память после использования, но AppDomain больше не используется в ASP.NET Core.
Подробнее здесь: https://stackoverflow.com/questions/533 ... t-core-api
Мобильная версия