Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为经典ASP创建不顺序阻止其他线程的DOTNET COM互操作程序集?_C#_.net_Asp Classic - Fatal编程技术网

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

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 {

设置--通过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对象的行为有关


进一步的测试表明,序列化/阻塞仅发生在会话级别(具有相同会话的所有其他页面按顺序被阻塞)。