ASP.NET和长时间运行的后台线程 - 它们如何混合?

时间:2008-11-27 12:59:34

标签: asp.net multithreading background

在我正在编写的ASP.NET应用程序中,我需要使用与特定服务器的连接(类似于数据库,但......不同)。建立连接非常昂贵(几秒钟,字面意思)所以我正在尝试编写一个池来提高可伸缩性。

一切都非常简单,最多只有一点 - 回收旧连接。旧的我的意思是“在游泳池中使用的连接时间超过5分钟”。清理它们还可以释放它们连接到的服务器上的资源。

我需要一种每5分钟唤醒一次的线程,检查池中旧的未使用的连接,然后关闭它们。但是,正如我从谷歌那里了解的那样,ASP.NET和长时间运行的线程不会混合。

我并不害怕整个过程被终止,因为那时我的游泳池也会得到清理(析构和所有)。我担心的是我的清理线程可能会在我的应用程序终止之前终止(并且我的池没有清理器)。或者反过来说 - 我的清洁线程会阻止我的应用程序关闭。

如何正确实现?

<小时/> 有几个人建议使用外部服务。我将详细说明“mysterios服务”,以便您了解为什么这不可行。

“神秘服务”是我公司写了十多年的应用程序的庞然大物。它是一个Delphi会计应用程序,它使用MSSQL或Oracle作为其数据。没有其他服务器。

最近(与几年前一样)它还获得了一个外部应用程序可以用来与之通信的接口。它是Windows控制台应用程序,基本上是相同的应用程序,除了GUI而不是GUI它监听套接字并使用某种Delphi序列化来传递数据。

在客户端,有一个.DLL(用Java编写,后来修改为在J#下编译),它解析这个二进制数据流并模仿.NET中的业务层。那就是 - 我得到了与Delphi中原始应用程序相同的所有业务类(700+)。或者非常接近的东西(我认为应用程序本身有> 3000个类)。而且我必须使用它们来做我想要的任何业务逻辑。我的所有电话都被转发到真正的应用程序,然后完成工作。

我无法直接连接到MSSQL / Oracle数据库,因为服务器中存在大量的bizzare业务逻辑,然后我必须复制并跟上(应用程序不断开发)。我无法重新创建客户端.DLL,因为这会耗费太多时间,并且协议将决定几乎相同的结果。我不能写一个包装器,因为我必须包装那里的所有700多个类。

换句话说 - 我无法控制业务层。它就是这样(实际上有几个人已经退出而不是继续使用它)。我只是想尽力而为。

<小时/> 对克里斯和其他好奇的人。

使用这些东西的代码是这样的:

ConnectionType con = new ConnectionType;
con.OpenConnection("server", "port", "username", "password");
BLObjectNumber234 obj = (BLObjectNumber234)con.GetBLObject("BLObjectNumber234");
obj.GetByPK(123);
// Do some stuff with obj's properties and methods
// that are different for each BLObject type

这些BL对象非常偶然。它们都是单例 - 对con.GetBLObject的调用总是返回相同的实例。大多数数据是通过调用特殊方法获得的DataTable,但是很多属性也在属性中;有些人需要使用bizzare未记录的常量调用特殊方法;还有一些属性是BL对象实例(不确定它们是否也是单例,我认为不是),那些需要特殊代码来填充等等。

总而言之,我将系统称为“补丁软件” - 因为它似乎是由一百万个补丁和变通方法组成的,所有这些都以当时最方便的方式粘在一起。

<小时/> 肿块吗? (无论如何你怎么碰到这里?)

3 个答案:

答案 0 :(得分:1)

您不需要包装每个类和函数,只需要执行您需要执行的操作。因此,您可能需要一种方法来获取某些数据和一种更新某些数据的方法,这将在服务中将其转换为对所需的各种函数的一系列调用。前端逻辑将被简化,因此这将简化网站的未来版本。


好的,只是为了解决你自己对这个问题的补充 - 我认为你对“包装”的含义过于笼罩。我希望你已经做了某种包装,或者我可能需要停止假设并直接问你这个问题:你是直接从asp.net页面后面的代码调用这个服务,还是你单独构建了用于处理前端和服务之间通信的类?一旦我们建立了您目前拥有的架构,我们将看到将此逻辑移动到单独的服务是否可行(然后获得WCF可以提供的好处)。

答案 1 :(得分:1)

我同意Chris的观点,将所有业务逻辑(与所有神秘业务对象通信的代码)放在与Web(表示)层不同的层中更为合适。

这将使您的应用程序设计更具可伸缩性,并且您可以更轻松地执行池,线程和其他与可伸缩性相关的任务。

如果您选择使用WCF在Web和业务层之间进行通信(如果它位于同一台计算机上,则使用名称管道),您将获得一个干净,可扩展且高性能的架构。

答案 2 :(得分:0)

您可以编写一个WCF服务来包装您尝试调用的服务,然后仅通过您的WCF服务应用程序与此神秘服务进行通信。

WCF有各种模型来处理池化和清理。