我在一个asp.net网站上工作。我们必须使用com互操作来与遗留的vb6 activex组件交互。在许多情况下,组件依赖于接收上下文对象(其本身是vb6 activex组件)作为参数。context对象的构建成本相当高。
因此,一种想法是构造上下文对象一次,并将其存储在asp.net会话中。然而,如果这个对象仅仅是activex组件的一个.net包装器,那么在会话中持久化这样的对象是否明智或可取呢?
此外,context对象包含特定于用户的信息,因此可以使用.net HttpRuntime缓存进行持久化,但需要特定于用户的键。
我了解使用asp.net会话aspnet-session question时的其他限制和需要注意的事项。
以一种稍微不同的方式来问这个问题:他们在存储.net对象时有什么问题吗?
发布于 2008-10-08 21:47:37
我认为当一个请求阻塞另一个请求时,你很快就会遇到问题。
默认情况下,ASP.NET在其线程上初始化COM,以将线程放入多线程单元中。VB6组件充其量是单元式的。这意味着当MTA线程创建组件时,如果已经存在一个组件(对于ASP.NET工作进程,它不会存在),那么它将被放入主STA中,或者专门为STA创建一个新线程。哪个MTA线程创建组件并不重要,相同的STA始终用于无法处理MTA模型的组件。这意味着对这些组件的每次调用都使用相同的线程,因此并发调用必须排队等待。
若要告知ASP.NET为单线程组件初始化COM,这至少会导致在与正在执行的页相同的线程上创建对象,请将AspCompat属性添加到@Page指令。
我不会缓存对象,因为当它们被重用时,它们很可能会出现跨线程的问题。
发布于 2008-10-08 20:52:41
我会在缓存中持久化它,这样它就不会为每个用户构造一次,除非这是想要的效果。
https://stackoverflow.com/questions/184840
复制相似问题