C# 如何为经典ASP创建不顺序阻止其他线程的DOTNET COM互操作程序集?
设置--通过DOTNET/C创建一个简单的COM加载项,它只在当前线程上休眠5秒钟C# 如何为经典ASP创建不顺序阻止其他线程的DOTNET COM互操作程序集?,c#,.net,asp-classic,C#,.net,Asp Classic,设置--通过DOTNET/C创建一个简单的COM加载项,它只在当前线程上休眠5秒钟 namespace ComTest { [ComVisible(true)] [ProgId("ComTester.Tester")] [Guid("D4D0BF9C-C169-4e5f-B28B-AFA194B29340")] [ClassInterface(ClassInterfaceType.AutoDual)] public class Tester {
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对象的行为有关