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