Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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# 经过一些时间后,P/Invoke变慢_C#_.net_Pinvoke_Unmanaged - Fatal编程技术网

C# 经过一些时间后,P/Invoke变慢

C# 经过一些时间后,P/Invoke变慢,c#,.net,pinvoke,unmanaged,C#,.net,Pinvoke,Unmanaged,我使用的是一个C#库,它的作用类似于非托管库的包装器。此库依赖于P/Invoke 我经历了一些奇怪的事情:在我的WinForms应用程序中,我有一个按钮,当我按下时,它从1迭代到N,并且在每次迭代中,它调用这个库 每次我按下按钮(不关闭应用程序),从函数调用方法的时间在第一次迭代中是恒定的(大约半秒),但对于其余的迭代,它变化很大,从半秒到2分钟不等 每个迭代中的工作都是相同的,所以这是不可理解的 我注意到,当库调用非托管函数时,会出现这种缓慢 你知道这是什么吗?我该如何改进 提前谢谢 -编辑-

我使用的是一个C#库,它的作用类似于非托管库的包装器。此库依赖于P/Invoke

我经历了一些奇怪的事情:在我的WinForms应用程序中,我有一个按钮,当我按下时,它从1迭代到N,并且在每次迭代中,它调用这个库

每次我按下按钮(不关闭应用程序),从函数调用方法的时间在第一次迭代中是恒定的(大约半秒),但对于其余的迭代,它变化很大,从半秒到2分钟不等

每个迭代中的工作都是相同的,所以这是不可理解的

我注意到,当库调用非托管函数时,会出现这种缓慢

你知道这是什么吗?我该如何改进

提前谢谢

-编辑-请注意,每次我再次按下按钮,循环的第一次迭代很快,但我调用的对象已经初始化(它是一个全局静态变量)


-edit2-到目前为止,我通过让所有对非托管函数的调用都从一个专用线程完成来解决这个问题。但是,我仍然不明白为什么主GUI线程不能处理它(没有其他线程进行调用)。

p/Invoke应该只是一个正常的库调用操作。您的意思是,从托管到非托管的转换是一个问题。然而,我从未发现这是一个问题

更有可能是本机代码库暂停。可能是在等待释放资源,例如互斥锁或文件锁,这会在以后的调用中超时?
确保您的函数原型是正确的,并且您没有因为堆栈不平衡或等效原因而收到异常。

p/Invoke应该只是一个正常的库调用操作。您的意思是,从托管到非托管的转换是一个问题。然而,我从未发现这是一个问题

更有可能是本机代码库暂停。可能是在等待释放资源,例如互斥锁或文件锁,这会在以后的调用中超时?
确保您的函数原型是正确的,并且您没有因为堆栈不平衡或等效原因而收到异常。

+1仅代表您的名字。要真正回答您的问题,听起来似乎是非托管库中的代码导致了问题。P/Invoke块,直到非托管代码返回。如果可以的话,试着调试库,看看哪段代码花的时间太长。@Humm,但在调用库之前,我是否会造成一个环境,使库做出这样的反应?不太可能,但是你可以从非托管库中发布你的C#P/Invoke定义和方法签名,我可以看一下。+1只是为了你的名字。要真正回答您的问题,听起来似乎是非托管库中的代码导致了问题。P/Invoke块,直到非托管代码返回。如果可以的话,试着调试库,看看哪个代码花费的时间太长。@哼,但可能是在调用库之前,我造成了一个环境,使库做出这样的反应吗?不太可能,但您可以发布非托管库中的C#P/调用定义和方法签名,我可以看一看。