我正在使用来自 Web 服务的 COM dll。COM dll 被添加为参考。我在 Global.asax 中将对象声明为静态的。我正在 Application_Start 中创建 COM 对象。
我必须在每个请求中调用 COM dll 接口函数。我在这里遇到异常,因为内存损坏。我可以看到同时请求出现时发生的日志。请让我知道最好的方法是什么。如何使其线程安全。?
我正在使用来自 Web 服务的 COM dll。COM dll 被添加为参考。我在 Global.asax 中将对象声明为静态的。我正在 Application_Start 中创建 COM 对象。
我必须在每个请求中调用 COM dll 接口函数。我在这里遇到异常,因为内存损坏。我可以看到同时请求出现时发生的日志。请让我知道最好的方法是什么。如何使其线程安全。?
尝试在每个请求中创建一个新实例,而不是使用对象的应用程序范围。
如果您在应用程序范围内访问它(例如通过 Application_Start),您将需要确保它对于多线程是安全的。我不知道 C++ dll 如何处理线程,但您可能能够在 asp.net 级别管理多线程。
例如,要管理一个简单的应用程序级计数器,代码类似于:
Application.Lock();
Application["SomeGlobalCounter"] =
(int)Application["SomeGlobalCounter"] + 1;
Application.UnLock();
有关更多信息,您可能希望查看有关Application State的 MSDN 页面。
如果 COM 对象是单元线程的,COM 提供同步以强制每个线程执行一次方法。
不过,一般来说,COM 应该抱怨多个线程试图使用跨线程共享的相同指针访问对象的实例。拥有一个包含指向对象的指针的静态变量可能是个坏主意。
一旦通过创建实例将 COM 对象共享库加载到某处(进程内或进程外),每个线程创建额外实例应该相当快。当然,这取决于对象构造期间正在执行的操作类型。