4.线程模型
在前面的接口说明中我们提到过 GetActiveServices( ) 函数,该函数返回的是当前工作进程中已经开启的报表服务线程数量。在通常情况下,我们都要求保持单线程运行:
..
if(dll.GetActiveServices( ) > 0) {
Response.Write("服务器忙,请稍后再试");
Response.End();
return;
}
..
如果您将这段判断语句删除或注释掉,相当于就允许多线程工作了,也即允许同时启动多个报表服务,您会发现服务仍然能运行,貌似挺正常。
但是实际上还是有问题的,我们程序内部为了保证系统的稳定性,对调用 func 函数的这一过程实行了线程堵塞:同一时刻只允许一个线程工作访问 func 函数,待 func 返回,再允许其它线程调用 func,原理图如下:
您看出问题来了吗?简单举个例子吧,假如同时有5个登录用户打开了报表服务,如果第一个用户访问的func函数碰巧很费时,那么其它4个用户也得老老实实地排队等待着。
如果您希望这5个用户都能各自独立、互不影响地访问报表服务,请使用下面的“进程模型”。