0

我在使用 DLLImport 时遇到了一些并发问题,我有一个 Dll 提供了一些我需要通过网络发送的报告,所以我有这个:

[DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall, 
CharSet = CharSet.Ansi)]
private static extern string PrintRep(several params...);

在 Dll 端有很多变量和实例,然后返回报告的路径。

我现在拥有的代码对 PrintRep 的调用有一个锁定,它可以工作,但显然会使挂起的请求等待,有没有办法在没有锁定的情况下工作?因为如果我取出锁,我会收到几个“尝试在受保护的内存上写入”错误,并且 Dll 最终会挂起。

4

2 回答 2

1

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

于 2009-03-16T22:12:30.930 回答
0

如果所有Web 请求都基于此调用等待,则应考虑在单独的线程上调用它,保持锁定,并仅使 PrintRep 调用请求者等待调用返回等待。

如果只有等待 PrintRep 调用完成的人是在等待的人,那么除了实现某种服务器端工作队列以及让用户以某种方式返回以检查队列之外,您无能为力,也许通过定时 AJAX 回调。

不管你做什么,避免在任何 ThreadPool 线程上调用它。ASP.Net 使用这些来处理页面请求。

于 2009-03-16T21:55:11.957 回答