Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用我的WebAPI,内存稳步增加_C#_C++_Memory_Memory Leaks_Webapi - Fatal编程技术网

C# 使用我的WebAPI,内存稳步增加

C# 使用我的WebAPI,内存稳步增加,c#,c++,memory,memory-leaks,webapi,C#,C++,Memory,Memory Leaks,Webapi,我目前正在为给定的核心API构建接口。核心是用本机C编写的,我们决定创建一个web API作为接口,使用C#将http请求重定向到正确的核心函数。然而,我发现每当我发出http请求时,内存就会不断增加,我不知道为什么会这样 我的系统如何工作: 我有一个ApicController,将http请求映射到函数,如下所示: [ApiController] public class MethodController : ControllerBase { public Metho

我目前正在为给定的核心API构建接口。核心是用本机C编写的,我们决定创建一个web API作为接口,使用C#将http请求重定向到正确的核心函数。然而,我发现每当我发出http请求时,内存就会不断增加,我不知道为什么会这样

我的系统如何工作:

我有一个ApicController,将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;
        }

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

    return EngineMutex<void>([&]
    {   
        Core_load(name, ret);
    });
}
EngEnEndoDS是一种用于通过P/Un调用调用本机C++函数的类。 load函数被重定向到以下代码段:

        [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(函数已经实现)。由于内核不是线程安全的,因此我必须在所有操作中使用此互斥锁:

//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();
    }
}
//它将lambda表达式作为参数,并可以返回任何指定的类型
模板
ReturnType EngineMutex(FunctionType lambda)
{
__试一试
{
进入关键部分引擎();
返回lambda();
}
__最后
{
离开临界截面_发动机();
}
}
使“加载”函数如下所示:

[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;
        }

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

    return EngineMutex<void>([&]
    {   
        Core_load(name, ret);
    });
}
void load(TCHAR*name,bool*ret)
{
*ret=假;
返回EngineMutex([&]
{   
堆芯荷载(名称,ret);
});
}

现在我的问题是,当我发送垃圾邮件“localhost:xxx/load/something”时,内存不断增加。似乎旧的和不相关的记忆不会被释放。来自C#的垃圾收集器也不会激活,如果我手动启动它,任何东西都不会被清理。似乎我分配了非托管内存,但没有释放它。但我所做的只是在核心中使用一个函数。内核中的函数不应该有任何内存泄漏,因为使用该内核的软件很早以前就发布了,滥发该函数不会增加内存。我所能想到的就是线程闲置并且无法关闭。。。我不知道。我研究了核心函数,它在复制作为参数给出的名称之前释放了旧名称(它还做了一些我不理解的加载工作),但正如我所说的,核心函数所做的应该是无关的,而不是问题的原因,但是我重定向请求的多个步骤?

在最后一个代码块中,路径是什么?你从来没有使用过<代码>名称>代码>参数。@核桃我怀疑OP知道C和C++与现在正在进行的整个C/C++的区别。修改函数参数以使它更简单。load函数得到两个TCHAR参数(name和path),但为了使其更简单,我删除了一个。