我正在使用一个C#库,它就像一个非托管库的包装器。该库依赖于P / Invoke。
我遇到了一些奇怪的事情:在我的WinForms应用程序中,我有一个按钮,当我按下时,它会从1迭代到N,并且在每次迭代中,它都会调用这个库。
每当我按下按钮(不关闭应用程序)时,从函数调用方法的时间对于第一次迭代(大约半秒)是恒定的,但是对于其余的,它变化很大,范围从半秒到大约2分钟。
每次迭代的工作都有些相同,所以这是不可理解的。
我注意到当库调用非托管函数时会发生这种缓慢。
知道它可能是什么以及如何改进它?
提前致谢!
-edit-请注意,每当我再次按下按钮时,循环的第一次迭代很快,但我正在调用的对象已经初始化(它是一个全局静态变量)!
-edit2-到目前为止,我设法通过从专用线程完成对非托管函数的所有调用来解决问题。但是,我仍然不明白为什么主GUI线程无法处理它(没有其他线程在进行调用)。
答案 0 :(得分:1)
P / Invoke应该只是一个普通的库调用操作。你所暗示的是从托管到非托管的转变是个问题。但是,我从未发现这是一个问题。
本机代码库更有可能停滞不前。也许等待释放资源,例如互斥锁或文件锁,这会在以后的调用中超时? 确保您的函数原型正确,并且由于堆栈不平衡或等效而未收到异常。