Память постоянно увеличивается с использованием моего WebAPI - PullRequest
0 голосов
/ 10 января 2020

В настоящее время я создаю интерфейс для данного основного API. Ядро пишет на нативном C, и мы решили создать веб-API в качестве интерфейса, используя C# для перенаправления http-запросов в нужную функцию ядра. Тем не менее, я обнаружил, что память увеличивается каждый раз, когда я делаю запрос http, и я не знаю, почему это так.

Как работает моя система:

У меня есть ApiController, отображающий запросы http на функции, например:

[ApiController]

    public class MethodController : ControllerBase
    {
    public MethodController()
        {

        }
       [HttpGet("load/{name}")]
        public bool load(string name)
        {
            EngineMethods.Marshaller_EngineMethod_Load(name, out bool result);
            return result;
        }

EngineMethods - это класс, используемый для вызова встроенной функции c ++ через P / Invoke. Функция загрузки перенаправляется на этот фрагмент кода:

        [DllImport(DllFilePath, CharSet = CharSet.Unicode)]
        [return: MarshalAs(UnmanagedType.I1)]
        private extern static void load(string name, out bool ret);

        public static void Marshaller_EngineMethod_Load(string name, out bool ret)
        {
            load(name, out ret);
        }

функция загрузки пишет на C ++. Теперь я должен использовать предоставленный мне основной API (функции уже реализованы). Поскольку ядро ​​не является потокобезопасным, я должен использовать этот Mutex для всех операций:

//it takes a lambda expression as an argument and can return any specified type
template<typename ReturnType, typename FunctionType>
ReturnType EngineMutex(FunctionType lambda)
{
    __try
    {
        enterCriticalSection_engine();
        return lambda();
    }
    __finally
    {
        leaveCriticalSection_engine();
    }
}

Создание функции «загрузки» следующим образом:

void load(TCHAR *name, bool *ret) 
{
    *ret = false;

    return EngineMutex<void>([&]
    {   
        Core_load(name, ret);
    });
}

Теперь моя проблема в том, что память продолжает расти, когда я спам "localhost: xxx / load / что-то". Кажется, что старая и неактуальная память не будет освобождена. Сборщик мусора из C# также не активируется, и если я запустил его вручную, ничего не очистится. Кажется, что я выделяю неуправляемую память и не освобождаю ее. Но все, что я делаю, - это использую функцию в ядре, которую мне дали. И функция, которая была в ядре, не должна иметь утечек памяти, потому что Программное обеспечение, использующее это ядро, долгое время выпускало go, а спам этой функции не приводит к увеличению памяти go. Все, о чем я могу думать, это темы, которые go простаивают и не закрываются ... Я не знаю. Я посмотрел на функцию ядра, и она освобождает старое имя перед тем, как скопировать имя, которое ему было дано в качестве аргумента (и он выполняет некоторые другие вещи, которые я не понимаю), но, как я уже сказал, то, что делает функция ядра, не должно иметь значения и не причина проблемы, а мои многочисленные шаги по перенаправлению запроса?

...