有一个ATL的COM组件,会被asp页面调用,组件方法中有一个耗时很长的操作,现在想在这个耗时的操作中循环检查asp页面中的Response对象IsClientConnected方法,如果检查到用户已断开了与服务器的连接就停止操作并返回,但问题是即使页面处理过程中关掉浏览器,每次检查IsClientConnected属性也都返回真,结果就是这个方法会一直运行下去直到结束,而用户在此过程中对系统中其他页面的访问也都会被阻塞,不知道是哪里出了问题代码如下:STDMETHODIMP CCommandTest::Test(...)
{
LOG("begin check");
for (int i=0; i<10; ++i) {
CComPtr<IObjectContext> pObjContext;
if (SUCCEEDED(GetObjectContext(&pObjContext))) {
CComQIPtr<IGetContextProperties> pGcp(pObjContext);
if (pGcp != 0) {
CComVariant v;
if (SUCCEEDED(pGcp->GetProperty(L"Response", &v))) {
CComDispatchDriver drv(v.pdispVal);
CComVariant v;
if (SUCCEEDED(drv.GetPropertyByName(L"IsClientConnected", &v))) {
if (v.boolVal == VARIANT_TRUE) {
LOG(" client is still connected"); // 每次都运行到这里
}
else {
LOG(" CLIENT DISCONNECTED!!");
break;
}
}
}
}
}
Sleep(1000);
}
LOG("end check");
return S_OK;
}
{
LOG("begin check");
for (int i=0; i<10; ++i) {
CComPtr<IObjectContext> pObjContext;
if (SUCCEEDED(GetObjectContext(&pObjContext))) {
CComQIPtr<IGetContextProperties> pGcp(pObjContext);
if (pGcp != 0) {
CComVariant v;
if (SUCCEEDED(pGcp->GetProperty(L"Response", &v))) {
CComDispatchDriver drv(v.pdispVal);
CComVariant v;
if (SUCCEEDED(drv.GetPropertyByName(L"IsClientConnected", &v))) {
if (v.boolVal == VARIANT_TRUE) {
LOG(" client is still connected"); // 每次都运行到这里
}
else {
LOG(" CLIENT DISCONNECTED!!");
break;
}
}
}
}
}
Sleep(1000);
}
LOG("end check");
return S_OK;
}
如果用户与服务器之间的连接在服务器端是时时显示的,这样不符合实际网络的运行情况吧,我想这个时候
应该是客服端主动的去向服务器端发送断开的信息,或者是采用服务器轮询的方式。
第一种方式我想,如果你使用过工商银行网上银行的话就知道了,在每次退出工商银行网页的时候,它都会弹出一个
确认框,我想这个确认框就是在客户端发送退出登录信息的时候出现的。
第二种方式估计会消耗很大的资源,对服务器来说也不好。
这两种情况我想都应该是在控件的参与下才能完成的,不管是客户端还是服务器端都需要有响应的控件来执行这种检查操作。