[英]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个以上的线程效率不高,请尝试考虑使用ThreadPool
( http://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.