序列阻塞/化使用从 ASP InProc 组件 (DLL) 时

文章翻译 文章翻译
文章编号: 216580 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

症状

在调用实例化一个从多个客户端的 inproc 组件 (DLL) 的活动服务器页面 (ASP) 页时用户会看到阻塞/序列化 ; 也就是所有客户端不必等待其他人来完成。如果 inproc 组件是单元或 Multithreaded 它不应运行这种方式。

原因

下面列出了此问题最常见的原因。

为您的虚拟目录的 IIS 设置可能设置了应用程序调试标志。如果启用了应用程序调试它将导致此虚拟目录是在单个线程上的所有请求。

另一个常见原因是不同的请求可以运行在相同的会话 ID 下,并因此,将序列化。这通常是这种情况,如果测试从一台计算机上的多个浏览器窗口。

其他可以解释此问题的原因是主要是相关的代码。以下是两个代码 snipplets (Visual Basic 和 Visual c + +),以便能够测试,是否您要处理的编码问题,请参阅 (也就是该代码示例使用工作正常没有序列化),或解决配置问题 (也就该代码示例显示的相同的行为按上文所述)。

解决方案

关闭应用程序调试在虚拟目录级别:
  1. 要打开 MMC 单击 开始 菜单,指向 程序Windows NT 4.0 选项包,和 Microsoft Internet 信息服务器。单击 Internet 服务管理器
  2. 选择 虚拟目录,然后选择 属性
  3. 单击虚拟目录的属性 (应用程序设置 窗格) 下半中的 配置
  4. 应用程序调试 选项卡上单击以清除下面的调试复选框:
    • 启用 ASP 服务器端脚本调试
    • 启用 ASP 客户端脚本调试

状态

此行为是设计使然。

更多信息

重现行为的步骤

在 Visual Basic 编写下面的类模块:
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function ThreadWait(nSeconds As Long) As Long
    Sleep nSeconds * 1000
    ThreadWait = GetCurrentThreadId
End Function
				

或写下面的代码中可视 C+ + / ATL:
STDMETHODIMP CThreadTest::ThreadWait(int n, long *threadid)
{
    DWORD nthreadId;
    nthreadId = GetCurrentThreadId();
    Sleep (n * 1000);
    *threadid = nthreadId;
    return S_OK;
}
				

以及下面的 IDL 声明:
    [id(1), helpstring("method ThreadWait")] HRESULT ThreadWait([in] int n, [out, retval] long* threadid);
				

确保您 ClassID 被命名为"ThreadWaitProject.ThreadTest。编译 DLL。

编写下面的活动服务器页面 (ASP) 脚本:
<%
  Dim objTest
  Set objTest = Server.CreateObject("ThreadWaitProject.ThreadTest")
  Response.Write "<TABLE border =1><TR><TD colspan=2 align=center><H3>InProc VB DLL<BR> ThreadWait 5 seconds</H3></TD></TR>"
  Response.Write "<TR><TD>StartTime: </TD><TD>" & Now & "</TD></TR>"
  Response.Write "<TR><TD>ThreadID: </TD><TD>" & objTest.ThreadWait(5) & "</TD></TR>"
  Response.Write "<TR><TD>EndtTime: </TD><TD>" & Now & "</TD></TR>"
  Response.write "<TR><TD>Session ID: </TD><TD>" & Session.SessionId & "</TD></TR></TABLE>"
  Set objTest = Nothing
%> 
				


为了成功测试此 ASP 代码,您必须启动此 ASP 页,从两个或多个不同的客户端 (计算机)

: 任务无法运行测试与 Internet Explorer 的多个实例在一台计算机上。

若要知道是否测试成功运行,您应遵守以下区别不同的客户端上在结果中:
  • 开始/结束时间应重叠
  • 线程 id 应该是不同
  • 会话 id 应该是不同

属性

文章编号: 216580 - 最后修改: 2014年2月23日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft Internet Information Server 4.0
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual C++ 6.0 专业版
关键字:?
kbnosurvey kbarchive kbmt kbintldev kbprb KB216580 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 216580
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com