1

我有 ASP.NET Web Api 项目,我需要在其中使用 VB6 Com dll。我有一个控制器,我在其中从 com dll 创建类对象并在我的操作中使用该对象。当我从 ca 调用该操作时,一切似乎都有效。2000-2500 个线程,但是当我从更多线程运行它时,在创建 com 对象实例时出现此错误:

Creating an instance of the COM component with CLSID from the IClassFactory failed due to the following error: 800401f7 (or 800a01b8).

我发现com组件在STA线程模式下运行,但ASP.NET Web Api在MTA线程模式下运行,但我不知道这是否导致问题,因为我找不到任何如何在ASP中将模式更改为STA。 NET Web API 项目。

我使用自托管的 ASP.NET Web Api,并将其托管在 Windows 服务上。当我停止服务并再次运行它时,我可以再次发送 ca. 2500 个线程。

编辑:我在示例 Windows 应用程序中创建了这样的线程:

for (int i = 0; i < threadsCount; i++)
        {
            Task task = Task.Factory.StartNew(() => {
                for (int j = 0; j < loopCount; j++)
                {
                    SendRequest();
                }
            });
        }

EDIT2:可能 com 对象没有被释放,因为在任务管理器中我可以看到句柄长大,当它有 2000 多个句柄时我得到这个错误。我打电话给 Marshal.ReleaseComObject,所以我不确定哪里出了问题。

4

1 回答 1

2

我不建议更改 ASP.NET Web Api 项目的线程模型。

STA 模式将在调用到框架的各个组件之间添加一个同步层。(请参阅您能解释一下 STA 和 MTA 吗?

当你“添加”这个同步层时,你可能会因为这个同步而遇到死锁。

我认为最好减少线程。

2500+线程不会有效率,尝试考虑一个ThreadPoolhttp://msdn.microsoft.com/en-us/library/system.threading.threadpool%28v=vs.110%29.aspx

您将获得性能,因为它将减少分配/切换Threads到 CPU 的开销。

至于错误:如果您创建 2500+ 个 COM 组件实例,则内存分配可能存在一些问题。特别是如果它是第三方 COM DLL,您无法确定分配的内存是否被适当地释放。COM 组件很有可能没有针对这么多的实例进行设计或测试。内存泄漏的可能性很大。等等等等

所以我的建议:

坚持使用 MTA 模型,减少线程。

于 2013-11-25T10:34:33.350 回答