繁体   English   中英

带有COM dll的ASP.NET Web Api

[英]ASP.NET Web Api with COM dll

我有需要使用VB6 Com dll的ASP.NET Web Api项目。 我有一个控制器,从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 Service上。 当我停止该服务并再次运行它时,我可以再次发送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对象,因为在任务管理器中,我可以看到Handles长大,并且当它具有2000+句柄时会出现此错误。 我叫Marshal.ReleaseComObject,所以我不确定会出错。

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

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

在“添加”此同步层时,由于此同步,您可能会遇到死锁。

我认为最好减少线程。

2500个以上的线程效率不高,请尝试考虑使用ThreadPoolhttp://msdn.microsoft.com/zh-cn/library/system.threading.threadpool%28v=vs.110%29.aspx

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

至于错误:如果您创建2500+的COM组件实例,则可能在内存分配中存在一些问题。 特别是如果它是第三方COM DLL,则不能确保已分配的内存已适当释放。 没有为该数量的实例设计或测试COM组件的可能性很大。 内存泄漏的可能性很大。 等等等

所以我的建议:

坚持使用MTA模型,减少螺纹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM