[英]How can I create a DOTNET COM interop assembly for Classic ASP that does not sequentially block other threads?
设置 - 通过DOTNET / C#创建一个简单的COM插件,它只会在当前线程上休眠5秒钟。
namespace ComTest
{
[ComVisible(true)]
[ProgId("ComTester.Tester")]
[Guid("D4D0BF9C-C169-4e5f-B28B-AFA194B29340")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Tester
{
[STAThread()]
public string Test()
{
System.Threading.Thread.Sleep(5000);
return DateTime.Now.ToString();
}
}
}
从ASP页面调用测试组件:
<%@ Language=VBScript %>
<%option explicit%>
<%response.Buffer=false%>
<%
dim test
set test = CreateObject("ComTester.Tester")
%>
<HTML>
<HEAD></HEAD>
<BODY>
<%
Response.Write(test.Test())
set test = nothing
%>
</BODY>
</HTML>
在Windows 2003服务器上运行时,test.asp页面会在COM组件休眠时阻止站点中的所有其他线程。
如何为ASP创建一个不阻止所有ASP工作线程的COM组件?
我想说这里发生的很可能是所有的Web请求都在某个地方被序列化了。 很难准确地说出这种情况发生在哪里,但有几种可能性。
您的COM对象位于单线程单元中,并以某种方式在Web请求之间共享。 生活在STA中的COM对象将具有源自除创建它们的线程之外的线程的调用,这些线程被编组到创建线程上。 结果是来自不同线程的调用者必须排队等待执行Tester.Test
。
ASP请求以某种方式被序列化。 基于我对ASP如何工作的理解,我很难想象会发生什么。 也许你有一个ASP.NET页面,AspCompat设置为true,这会导致他们共享同一个公寓。 我真的很抓住这里,但无论如何我会说你的问题与STA COM对象的行为有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.