4.线程模型

在前面的接口说明中我们提到过 GetActiveServices( ) 函数，该函数返回的是当前工作进程中已经开启的报表服务线程数量。在通常情况下，我们都要求保持单线程运行:

    ..
    if(dll.GetActiveServices( ) > 0) {
     Response.Write("服务器忙，请稍后再试");
     Response.End();
     return;
    }
    ..

如果您将这段判断语句删除或注释掉，相当于就允许多线程工作了，也即允许同时启动多个报表服务，您会发现服务仍然能运行，貌似挺正常。
但是实际上还是有问题的，我们程序内部为了保证系统的稳定性，对调用 func 函数的这一过程实行了线程堵塞：同一时刻只允许一个线程工作访问 func 函数，待 func 返回，再允许其它线程调用 func，原理图如下：
您看出问题来了吗？简单举个例子吧，假如同时有5个登录用户打开了报表服务，如果第一个用户访问的func函数碰巧很费时，那么其它4个用户也得老老实实地排队等待着。
如果您希望这5个用户都能各自独立、互不影响地访问报表服务，请使用下面的“进程模型”。
5.进程模型

要彻底让每个登录用户都互不牵制、独立工作，请在IIS中将应用程序池配置成一个Web园(Web Garden)，即允许多进程工作，以提高报表服务的并发吞吐量.
配置方法很简单，在 IIS 的“应用程序池”中，找到硕正服务所在的程序池(如果不存在就创建一个)，在“高级设置”中，将最大工作进程数从默认的“1”改成多个：
例如设成“5”，就表示同时能容纳5个并发用户工作，这一点我们已经实际验证过。
设成Web园还有一个好处: 万一某个进程崩溃，也不影响其它访问者。