我在使用DLLImport时遇到一些并发问题,我有一个Dll提供了一些我需要通过网络发送的报告,所以我有这个:
[DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
private static extern string PrintRep(several params...);
在Dll方面,有很多变量和实例然后返回报告的路径。
我现在的代码已经锁定了PrintRep的调用,它可以工作,但显然会使待处理的请求等待,有没有办法让它在没有锁的情况下工作?因为如果我取出锁定,我会得到几个“尝试写入受保护的内存”错误,并且Dll最终会挂起。
答案 0 :(得分:1)
报告DLL线程是否安全?我猜不会,因为你说如果你移除了锁,那你就会出错。因此,您有两个选择,使DLL线程安全(需要源和更改旧dll),或序列化您已完成的DLL请求。这是你唯一的两个选择。但是,您是否需要让用户等待报告呢?您是否可以维护等待报告的用户列表以及呼叫所需的参数,然后将网页返回给用户,让他们知道您将通过电子邮件向他们发送报告。然后,您可以以串行方式处理报告,同时不会导致用户等待结果。
答案 1 :(得分:0)
如果所有 Web请求都在等待此调用,则应考虑在单独的线程上调用此方法,保持锁定,并仅使PrintRep调用请求程序等待调用返回等待。
如果只有等待PrintRep调用完成的人等待,那么除了实现某种服务器端工作队列之外,没有太多可以做的,并且让用户以某种方式返回检查队列,也许是通过定时的AJAX回调。
无论你做什么,都要避免在任何ThreadPool线程上调用它。 ASP.Net使用它们来处理页面请求。