簡體   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