ASP.NET中的Concurency线程和锁定

时间:2014-07-28 20:27:31

标签: c# asp.net asp.net-mvc asp.net-web-api concurrency

我想知道asp.net如何处理“同时”的网络请求。让我们想象一个交易平台,交易者可以实时购买股票。每当交易者发送订单时,系统必须确保交易线程中只有一个请求。这样可以保护交易的完整性。举一个简单的例子来说,系统需要1秒才能执行订单。在这1秒期间,所有其他交易必须等待一个接一个地进行(这可以被优化,但是为了示例的缘故,它就是这么简单)。

我的问题是ASP.net如何管理并发和线程?如果我对我的代码的敏感部分使用锁定,那么由asp.net创建的所有请求是否会一个接一个地进入?最好的方法是什么? ASP.net创建的每个线程如何相互交互以确保另一个线程尚未处于敏感锁定部分?

我希望我的问题有道理,问我是否不清楚。

编辑:我应该确定订单是通过webservices发送的,并且用户期望得到答案(成功或失败)。

2 个答案:

答案 0 :(得分:1)

ASP.NET实际上并没有那么多地管理并发性。它所做的就是接受请求并将它们作为工作项推送到线程池。最终,框架调用应用程序代码。

您的应用程序的功能是您的业务。 ASP.NET并不关心。如果你想锁定并等待,那就这样吧。 ASP.NET既不想知道这个事实,也不知道它是否想要。对于系统来说,它看起来像你的工作项目需要很长时间(因为它们阻止了锁定)。

没有办法告诉ASP.NET以串行方式调用您的交易系统。你必须自己建立这种协调。

如您所见,ASP.NET内部的同步类似于ASP.NET之外的同步。 (我已经掩盖了很多细节。)

答案 1 :(得分:0)

首先,如果您需要非常快速的交易,请忘记ASP.NET并考虑使用套接字的客户端/服务器。是这个市场通常使用。

我认为你的问题应该考虑异步设计。每个Web请求都将订单发送到服务,并且该服务针对市场执行。

此“服务”可以是Windows服务,您可以使用以下备选方案之一将所有交易排入单个流程:

1)ASP.NET通过Socket向服务发送命令 2)数据库(轮询很糟糕,但实现起来比较简单) 3)MSMQ或其他实现(RabbitMQ,Websphere MQ)。

其他替代方法是使用锁同步ASP.NET进程中的线程(查看C#中的“lock”保留字)。我不认为在等待订单执行时阻止ASP.NET线程是个好主意。

也可以考虑使用HTML5 WebSockets。

但请考虑您的非功能性要求。通常这种“低延迟”市场需要性能。