我正在开发一个asp.net网站。我们必须使用com interop与传统的vb6 activex组件进行交互。在许多情况下,组件依赖于接收上下文对象(其本身是vb6 activex组件)作为参数。构造上下文对象的成本相当高。
因此,一个想法是上下文对象构造一次并存储在asp.net会话中。但是,如果此对象只是一个围绕activex组件的.net包装器,那么在会话中持久保存这样的对象是明智的还是可取的?
此外,上下文对象包含用户特定信息,因此可以使用.net HttpRuntime Caching持久化,但需要用户特定的密钥。
我了解使用asp.net session aspnet-session question时需要注意的其他限制和事项。
以稍微不同的方式提出问题:存储.net对象的任何问题或问题是否只是com对象的包装器?
答案 0 :(得分:3)
我认为你很快会遇到一个请求阻止另一个请求的问题。
ASP.NET默认情况下在其线程上初始化COM以将线程放在多线程单元中。 VB6组件充其量只是公寓型号。这意味着当MTA线程创建组件时,如果已经存在(对于ASP.NET工作进程,它不会),则将其放入主STA中,或者专门为STA创建新线程。哪个MTA线程创建组件无关紧要,相同的STA始终用于无法处理MTA模型的组件。这意味着每个对这些组件的调用都使用相同的线程,因此并发调用必须排队等待。
告诉ASP.NET为单线程组件初始化COM,这至少会导致在与执行页面相同的线程上创建对象,将AspCompat
属性添加到{{3}指令。
我不会缓存这些对象,因为它们在重用时很可能会出现跨线程问题。
答案 1 :(得分:0)
我会将它保留在缓存中,这样每个用户就不会构建一次,除非这是预期的效果。