我们知道,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、
---------------------------------------------------------------
照我的理解,这好像是asp的问题。
---------------------------------------------------------------
我明白了,原来ASP运行时把每个请求都放在一个中央请求队列里,由ASP管理的线程池中的STA线程监视该队列并以先进先出的方式处理请求,这也就是为什么你的两个请求不能并发的原因。
---------------------------------------------------------------
我刚写了一大篇,提交失败,郁闷。明天在答吧。
---------------------------------------------------------------
to yangmajituipo()
你的这个帖子打击了很多朋友的积极性
你也可以不用Sleep,就像我前面说的,用GetTickCount得到该方法运行时间,然后用该Time作文件名(避免在文件重名等待)打印启动时间,执行一个费时的操作,打映结束时间,可以发现多个现程运行时,仍然是串行的。(启动时间均在上一方法执行完后,大家可以实验)
绝对不是并发的,已经得到很多人的共识。
特别是最后一句话,可能你现在比较急,所以说出来的话也比较急躁吧!
---------------------------------------------------------------
我也做了一些试验,结论是在ASP调用COM组件确实是非并发的。
我是按照 yangmajituipo所说的进行了测试,并且打印了一些数据文件,供大家参考。测试环境是两台机器同时运行两个ASP,得出四组数据,写在一个文件中。
源程序如下:
STDMETHODIMP CTest::Test()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
DWORD dwTime3 = GetTickCount();
//Do something always >10s
int i = 0;
While(i<0x7ffe){
i++;
int j = 0;
While(j<0x7ffe)
j++;
}
DWORD dwTime4 = GetTickCount();
char cName[50] = "C://";
char cTemp[30] = "";
sprintf(cTemp,"%d",dwTime4);
strcat(cName,cTemp);
strcat(cName,".txt/0");
ofstream TimeTest(cName,ios::app);
TimeTest<<"Time Start"<<endl;
TimeTest<<dwTime3<<endl;
TimeTest<<"Time end"<<endl;
TimeTest<<dwTime4<<endl;
TimeTest<<"Time Count"<<endl;
TimeTest<<(dwTime4 - dwTime3)<<endl;
TimeTest.close();
return S_OK;
}
结果发现记录下来的时间没有出现重合的部分,也就是说每个函数的进入时间和结束时间是单独在一段时间区域内的,并没有我们想象的并发的出现。
希望这些能对大家的讨论有所帮助。
---------------------------------------------------------------
已经很长时间没接触ASP了,我把我还记得的一些印象跟你说一下,希望对你所帮助:
我记得ASP创建对象时,是在DLLHOST.EXE中启动的,如果能够同时存在多个DLLHOST.EXE那就应该可以并发。
你看看内存里是否有多个DLLHOST.EXE,我觉得应该是没有的,否则太浪费资源了,那么可能是DLLHOST.EXE中的代码导致了这个问题。我现在没有条件试,帮不了你的忙了。不知道IIS中是否有相应的选项呢?
还有你可以先试一下在一个进程中能不能实现并发调用(至少要利用多线程才行)。
你给的例子都是在多个独立的进程实现并发调用的。
唯独在ASP中,只使用了DLLHOST.EXE一个进程进行调用。
最后,你试一下使用ActiveEXE来编写组件看看能不能独立运行进程。
---------------------------------------------------------------
如果只是在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))。
COM+并发性
最新推荐文章于 2022-03-09 23:57:36 发布