微软到底实现了这个功能没有,欢迎大家来做实验

yangmajituipo 2002-04-25 11:09:37
我们知道,COM的优势之一就是并发性。现在有一个问题无法解决,就是在IIS中,在同一页面范围的用VC写成的组件无法实现并发。我查了一些关于线程模式的书,都无法得到答案。一个有趣的现象时,我用VC或VB做客户端掉用组件,却能实现并发,甚至这些客户端与单独的一个Browser访问ASP,相互之间也能实现并发。

大家可以按以下的模式实施。
1、用ATL创建一个空的DLL组件,
2、添加一个Simple object,线程模式选BOTH
3、添加一个方法,Test(){ Sleep(20000);}
4、编译
5、简单起见,用VB创建客户端,
set objTest = CreateObject(。。。)
objTest.Test
生成Exe

6、将组件配置在COM+中,设置为可调,
7、运行一个VB客户端,这时将启动调试环境,在Test方法处设置断点。
现在我们同时启动两个VB客户端,可以看出,在前一个睡眠的情况下,方法被执行了
我们证明了并发

8、现在写一个ASP,
set ObjTest = Server.CreateObject(。。。)
ObjTest.test

9。访问该ASP,同时启动VB客户端,。。。。。证明并发

10、现在打开两个IE窗口,访问ASP,发现只有一个完成以后,才能调另一个
不能并发!



why,why

why,why


why,why


why,why


why,why

大家也可以来进行补充,发表你的看法



7、
...全文
33 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
SnHnBn 2002-05-10
  • 打赏
  • 举报
回复
我回去再找了另一台机子测试,发现了一个很有意思的现象:
我在配置了COM+组件之后,再进行类似的测试发现:第一次打开两个IE发现被访问被串行化,但是关掉这两个IE,不作任何改动,从新再打开两个IE,结果能够并发访问。(奇怪1)
我在使用Tencent Explorer这个在一个窗口内开多个页面的浏览器中,基本上打开多个同样的页面,访问均被串行化。(奇怪2)
通过进一步测试:
在我原先的ASP代码CreateObject之前,加入:
Response.Write "Create Time: " & Time & "<BR>"
再访问页面,发现不是COM组件被串行,而是ASP页面被串行。因为下一个页面的Create Time紧接着在前一个页面的End Time之后。这个证明不是COM的问题,而是IIS配置的问题。
不过上面两个奇怪的问题,谁能够解释一下呢?
fftongzhi 2002-05-10
  • 打赏
  • 举报
回复
问题终于解决,从中加深理解了很多概念。感谢 yangmajituipo的帖子,acptvc 推荐的好文章,以及众兄弟的参与。受益匪浅。
yangmajituipo 2002-05-10
  • 打赏
  • 举报
回复
Tencent Explorer这个在一个窗口内开多个页面的浏览器,每一个打开的窗口都共享一个SessionID.


结帖了,没拿到分或分不够的同志请到

http://www.csdn.net/Expert/TopicView1.asp?id=681293
http://www.csdn.net/Expert/TopicView1.asp?id=674999
http://www.csdn.net/Expert/TopicView1.asp?id=675007

登记拿分,分数超过600
bljbljbljblj 2002-05-08
  • 打赏
  • 举报
回复
学到不少!
yangmajituipo 2002-05-08
  • 打赏
  • 举报
回复
哎,是我没写清楚,是IIS中应用程序中的应用程序调试标志被打开了。
yangmajituipo 2002-05-08
  • 打赏
  • 举报
回复
原来设为可调后,IIS会将命令串行,这也是我没想到的。所以如果大家没有完全照我说的作(设置断点调试),自然就见不着了,在此向疑惑的朋友们道歉。
yangmajituipo 2002-05-08
  • 打赏
  • 举报
回复
谢谢谢谢
acptvc(微软全球技术中心 VC技术支持) ( )
问题解决了。



SYMPTOMS
When calling an Active Server Page (ASP) page that instantiates an inproc component (DLL) from multiple clients, the user will see blocking/serialization; that is, all the clients have to wait for others to finish. If the inproc component is either Apartment or Multithreaded it should not behave this way.



CAUSE
The most common reasons for this behavior are listed below.

The IIS settings for your virtual directory may have the application debugging flags set. If application debugging is turned on, it will cause all requests to this virtual directory to be on a single thread.

Another common reason is that the different requests could run under the same Session ID and will, therefore, be serialized. This is usually the case if testing from multiple browser windows on a single machine.

Other reasons that can explain this behavior are mostly code related. Following are two code snipplets (Visual Basic and Visual C++) to be able to test and see if you are dealing with a coding issue (that is, the sample code works fine with no serialization), or with a configuration issue (that is, the sample code is showing the same behavior as described above).


感谢大家对本帖子的关注。
to SnHnBn(大可达) :DCOM也使用DLLhost.实现并发性跟有多少个dllhost无关.

过一阵子结帖
yangmajituipo 2002-05-06
  • 打赏
  • 举报
回复
今天,有朋友告诉我说,在XP下怎么试都行,2000下为什么不啊?
acptvc 2002-05-06
  • 打赏
  • 举报
回复
如果只是在page scope内使用COM对象,那么我们讨论的并发性已经跟COM的线程模式关系不大,主要是和IIS的配置有关,包括isolation level,app debugging等等。你可以对照以下两篇文章看看:
1.
PRB: Blocking/Serialization When Using InProc Component (DLL) from ASP (Q216580)
URL: http://support.microsoft.com/support/kb/articles/Q216/5/80.ASP

2.
Title: PRB: User Requests to Active Server Pages Serialize from the Browser (Q244298)
URL: http://support.microsoft.com/support/kb/articles/Q244/2/98.ASP

实现并发性跟有多少个dllhost无关。事实上每个ASP app只在一个dllhost中执行。如果你选择isolation level为medium pool的话,那么几个ASP app会共享一个dllhost;如果为high的话,每个不同的ASP app会单独launch一个dllhost;为low的时候ASP app会和IIS共享一个进程inetinfo.exe. Dllhost只是个实现了ISurrogate接口的surrogate进程。

IIS 5+跟COM+的关系是:象很多微软其他app server一样,IIS 5+也利用了com+提供的服务,比如isolation就是这样的例子.


- 微软全球技术中心 VC技术支持

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
为了为您创建更好的讨论环境,请参加我们的用户满意度调查
(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
SnHnBn 2002-05-06
  • 打赏
  • 举报
回复
为了公正起见,把我的试验过程写出来:
因为我对VB比较熟悉,因此我用VB编写测试组件ActiveX DLL:
工程TestCOM:
类TestOBJ:
public sub DoFunc()
sleep 10000 'Sleep已经声明
end sub
编译生成DLL。

ASP中:http://LocalHost/Test/TestCOM.ASP
<%
Set TestC=Server.CreateObject("TestCOM.TestOBJ")
response.write "Begin Time:" & Time & "<BR>"
TestC.DoFunc
response.write "End Time:" & Time
%>

打开两个IE,输入上述ASP地址,在第一个IE上发出请求后,立即切换到第二个IE发出请求。完成后,第一个IE上显示:
Begin Time:14:26:22
End Time:14:26:32
第二个IE上显示:
Begin Time:14:26:23
End Time:14:26:33
可以看到时间重合了,证明可以实现并发.打开任务管理器观察进程,有两个DLLHOST。
而如果把Test目录的保护级别设置为低(注意要设置Test虚拟目录的,而不是根目录的),第一个IE上显示:
Begin Time:14:27:34
End Time:14:27:44
第二个IE上显示:
Begin Time:14:27:44
End Time:14:27:54
可以看到时间不能重合,在第一个执行完了之后紧接着执行第二个。打开任务管理器观察进程,只有一个DLLHOST
SnHnBn 2002-05-06
  • 打赏
  • 举报
回复
请yangmajituipo() 注意:
DLLHOST的确是IIS专用的,请你好好看一下IIS的资料。你说的Surrogate是COM技术的一部分。但是DLLHOST不是,他是IIS技术的一部分,请你注意!
请你在确认一下保护级别是否真的是中,因为在IIS的虚拟目录结构中,不同的目录可以有不同的保护级别,不要只看根目录的。还有,我估计你把IIS或则Win2000重装一次应该就可以解决了。因为我的机器上试验很正常,这就说明可以实现并发。
perennial_xulin 2002-05-05
  • 打赏
  • 举报
回复
关注!
sailing1492 2002-05-05
  • 打赏
  • 举报
回复
UP一下,难得的好帖子。态度认真,讨论执着
yangmajituipo 2002-05-04
  • 打赏
  • 举报
回复
__其他非Web应用程序并不使用DLLHOST
我认为进程内组件必须通过一个Surrogate,包括WEB程序和DCOM程序。

我所描述的现象都是在应用程序的保护级别为中的情况下发生的

暂时写到这,希望大家继续补充。
bucher 2002-05-03
  • 打赏
  • 举报
回复
楼上的已经说到了点子上
我觉得关键就在于IIS的隔离级别,这决定了是否可以实现同一个页面的并发访问
SnHnBn 2002-05-02
  • 打赏
  • 举报
回复
再强调一点:这个问题出现在同一进程的同步调用上,实质上,在一个进程中不管调用一个还是多个组件的方法,均不能实现并发,除非所调用的方法是异步的,这个问题实质上是一般编程的常识,其实跟COM无关,因为要并发执行,在一个进程中只有创建多个线程才能做到。ActiveDLL是从属于调用进程的。ActiveEXE通过代理与调用进程通讯,但是调用进程仍然不能并发。多个创建/调用进程分别在各自的进程环境中创建/调用ActiveDLL,通过代理共用一个ActiveEXE进程创建多个线程创建/调用各自的ActiveEXE的组件实例(这个过程很复杂)。但是对每一个调用进程,均不能实现并发(除了那个ActiveEXE进程),因此一个DLLHOST.EXE只能同时调用一个方法,它必须等待方法返回。因为DLLHOST.EXE不属于ActiveX,是COM+之外的调用者。

以上观点,纯属个人理解,有不对的地方还请各位多多指点。
SnHnBn 2002-05-02
  • 打赏
  • 举报
回复
TO yangmajituipo():
你说不通过ASP在一个DLLHOST内运行的组件调用可以并行,但是DLLHOST是IIS调用ActiveX用的环境代理程序,其他非Web应用程序并不使用DLLHOST,是不是你理解有误?
还有,我今天在我的机器上小试了一下,按照我原来的思路,已经解决了你的这个问题,如下:
在要使用的ASP所在的虚拟目录下设置IIS的应用程序保护级别为中或者高,如果设置为低,表示创建的组件将与IIS公用同一进程,这时候无法实现并发。在保护级别为低的情况下,可以看到在两个浏览器发出请求时,进程中只有一个DLLHOST。如果保护级别为中以上,就会看到有两个DLLHOST,而且并发也可以实现,因为IIS启动了两个代理进程,就如同你使用两个客户端实现的并发操作(因为在两个进程中)。
从另一个角度来看这个问题,如果想要在一个进程中并发调用多个组件那么
:1。组件提供的方法本身支持异步调用,但是在你的例子中显然不是异步的。2。该进程创建多个线程进行调用,但是这种方法有太多的困难。我们知道COM+是依赖环境的,基本上我无法想象如何在一个进程中处理这些细节,以我目前所掌握的知识,我觉得非常困难,这一点我希望有着方面的专家进行一下解答。鉴于以上所述,DLLHOST不能并发调用多个组件。
最后,补充说明一下DLLHOST:在IIS中,为了避免在IIS的进程中直接使用ActiveXDLL带来的安全问题,IIS使用了DLLHOST进行代理。因为如果直接在IIS的进程中直接创建和调用DLL组件,一旦其中一个组件发生异常,整个IIS就会被当掉。而如果使用ActiveXEXE又会导致性能下降。
在这个问题上,看到很多人都走错了方向,从而陷入了COM原理当中,实质上这是IIS的处理方式,与COM无多大关系。不过使用ActiveEXE时,到是跟线程池有关系,必须保证ActiveEXE能够同时创建多个组件的实例。
yangmajituipo 2002-04-30
  • 打赏
  • 举报
回复
可能有些朋友误会了,我并不是访问不同的ASP页面用同一个组件,
是在一个页面内执行操作,比如我们有一个页面要花很大的计算量,第一用户的请求到了以后,启动组件,第二个用户的请求到了以后,如果第一个用户还在计算中,就只好等待了,如此一来,就成了串行操作了。

!!!一定注意,是同一个ASP页面
yangmajituipo 2002-04-30
  • 打赏
  • 举报
回复
对啊,我现在是比较急,有些话未免武断,
但是如果大家得出不同的结果,请写出来一下好吗?
realsong 2002-04-30
  • 打赏
  • 举报
回复
to yangmajituipo()
你的这个帖子打击了很多朋友的积极性

你也可以不用Sleep,就像我前面说的,用GetTickCount得到该方法运行时间,然后用该Time作文件名(避免在文件重名等待)打印启动时间,执行一个费时的操作,打映结束时间,可以发现多个现程运行时,仍然是串行的。(启动时间均在上一方法执行完后,大家可以实验)


绝对不是并发的,已经得到很多人的共识。

特别是最后一句话,可能你现在比较急,所以说出来的话也比较急躁吧!
加载更多回复(40)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧