繁体   English   中英

如何为经典ASP创建一个不会顺序阻止其他线程的DOTNET COM互操作程序集?

[英]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.

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