Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
ASP.NET上的P/Invoke[DllImport]_Asp.net_Pinvoke_Dllimport - Fatal编程技术网

ASP.NET上的P/Invoke[DllImport]

ASP.NET上的P/Invoke[DllImport],asp.net,pinvoke,dllimport,Asp.net,Pinvoke,Dllimport,我在使用DLLImport时遇到了一些并发性问题,我有一个Dll,它提供了一些需要通过web发送的报告,因此我有: [DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] private static extern string PrintRep(several params...); 在Dll端,有很多变量和实

我在使用DLLImport时遇到了一些并发性问题,我有一个Dll,它提供了一些需要通过web发送的报告,因此我有:

[DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall, 
CharSet = CharSet.Ansi)]
private static extern string PrintRep(several params...);
在Dll端,有很多变量和实例,然后返回一个包含报告的路径

我现在的代码在PrintRep调用周围有一个锁,它可以工作,但显然会使挂起的请求等待,有没有一种方法可以在没有锁的情况下工作?因为如果我取出锁,我会有几次“尝试写受保护的内存”错误,而Dll最终挂起。

< P>如果所有的Web请求都是基于这个调用等待的,你应该考虑在单独的线程上调用它,保持锁,并且只让PrimTrp调用请求器等待调用返回等待。p> 如果只有等待PrintRep调用完成的人在等待,那么除了实现某种服务器端工作队列,让用户以某种方式返回检查队列(可能是通过一个定时的AJAX回调)之外,您没有什么可做的


无论您做什么,请避免在任何线程池线程上调用此函数。ASP.Net使用它们来处理页面请求。

报表DLL是线程安全的吗?我猜不会,因为你说过如果你拆了锁,你就会出错。因此,您有两种选择,使DLL线程安全(需要源代码和对旧DLL的更改),或者将请求序列化到DLL,这是您已经完成的。这是你仅有的两个选择。但是,您是否需要让用户立即等待报告?您是否可以维护等待报告的用户列表以及通话所需的参数,然后将网页返回给用户,让他们知道您将通过电子邮件向他们发送报告。然后,您可以以串行方式处理报告,而不会导致用户等待结果