C# 使用我的WebAPI,内存稳步增加
我目前正在为给定的核心API构建接口。核心是用本机C编写的,我们决定创建一个web API作为接口,使用C#将http请求重定向到正确的核心函数。然而,我发现每当我发出http请求时,内存就会不断增加,我不知道为什么会这样 我的系统如何工作: 我有一个ApicController,将http请求映射到函数,如下所示: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
[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),但为了使其更简单,我删除了一个。