2009-08-04 49 views
1

对于使用.NET的新Web应用程序项目,现有库(用C#编写)将在线提供,该库对数据模型中的信息执行一些计算。我可以在多用户.NET Web应用程序中使用非线程安全库吗?

库需要由许多用户在同一时间访问。每个用户将使用一组不同的数据。用户还可以修改模型数据并使用修改的输入参数重复计算。

目前,库一次只能处理一个数据模型。 (让我们假设有像静态类和单例那样的设计问题)。

如果.NET Web应用程序(使用HTML网页的简单Web前端)想要使用此库,是否有技术可以为每个客户端创建单独的库实例,以保持模型和其他参数分开吗?

+0

你的用户需要在同一时间用不同的模型数据的工作,但你的库只能同时处理一个模型的数据?你说什么意味着它是不可能的,该库中是否只有静态类?我们在谈什么图书馆? – 2009-08-04 07:45:42

+0

让我们假设有像静态类或单例那样的设计问题无法快速解决。 – mjn 2009-08-04 08:17:38

回答

1

您可以在外部加载模块并每次创建一个新实例或使用.NET Enterprise Services(COM +)使用对象池,但如果对象是有状态的,您仍然会遇到可伸缩性问题。

每个评论:是的,你可以。查看this example,快速入门。

+0

非常感谢您的链接,COM +对象池是一个非常有趣的选项 – mjn 2009-08-04 07:51:55

+0

您是否知道我是否可以在ASP.NET应用程序中使用COM +对象池? – mjn 2009-08-04 08:19:32

0

如果您想您的用户asp.net应用程序实例中共享一个单独的对象,它需要与线程安全执行任何种类的访问和修改。

您可以使用和管理库的情况下创建一个包装。

+0

图书馆目前说'像对待单身人士一样对待我',但Web应用程序想要用不同的状态创建它的许多实例。基本的问题是如何创建库的许多实例并将Web客户机会话绑定到一个库实例。 – mjn 2009-08-04 07:56:12

0

您可以使用锁定,例如:

lock (typeof(YOUR_MODEL_CLASS)) 
{ 
} 

或尝试和队列计算,参数保存到数据库文件,并通过有一个服务运行,但每次计算在自己的时间。

会有一个门槛,这将是稳定/可用。

+0

加载模型可能需要一分钟,完成后用户需要以交互方式使用它。排队/负载平衡是一个好主意,但在这种情况下,客户端请求与其数据集之间的切换需要很长时间。 – mjn 2009-08-04 07:49:54

0

大多数类的.NET Framework不为多线程访问做,因为你可以在MSDN看到。

如果你说,你的用户提供不同的数据集工作,所以你的程序需要在库中为每个用户创建类的实例 - 这听起来没有问题给我。

批判会是,如果许多用户会在同一组数据的工作,那么你就必须关心图书馆的多线程能力。

0

如果你谈论的是那些没有设置要在那么多线程环境中,答案是肯定安全的一个组成部分。但是,您必须选择一种“同步”访问组件的机制。 C#中最简单的形式是“锁定”语法。

如果你是在谈论一个组件,它允许一个单一实例在同一时间才把答案是否定的。这是因为Web应用程序本质上是多线程的。在asp.net中使用它需要你锁定整个服务器,等待组件完成,这通常是一件坏事。 我最好的解决方案是使这种组件成为异步操作。允许用户指定输入参数,然后将这些数据保存到某个位置,并使用某种调度程序一次处理一个数据。当过程完成时,通知用户工作已完成等。

另外,当组件花费大量时间来处理时,最好不要让用户同步地与组件进行交互。

相关问题