ASP.NET中的并发线程和锁
本文关键字:线程 并发 NET ASP | 更新日期: 2023-09-27 18:15:22
我想知道asp.net如何处理"同时"web请求。让我们想象一个交易者可以实时购买股票的交易平台。每次交易者发送订单时,系统必须确保只有一个请求可以在交易线程中。这是为了保护贸易的完整性。举个简单的例子,系统需要1秒来执行订单。在这1秒内,所有其他交易都必须等待一个接一个地进行(这可以优化,但为了示例起见,假设它很简单)。
我的问题是ASP.net如何管理并发性和线程?如果我对代码的敏感部分使用锁,所有由asp.net创建的请求都会一个接一个地进入线程吗?最好的方法是什么?ASP.net创建的每个线程如何相互交互以确保另一个线程不在敏感锁定部分?
我希望我的问题是有意义的,问我,如果它不清楚。编辑:我应该明确的是,订单是通过webservices发送的,用户期望得到一个答案(成功或失败)。
NET实际上并没有那么多地管理并发性。它所做的就是接受请求并将其作为工作项推送到线程池。最后,框架调用应用程序代码。
那么,你的应用做什么是你自己的事。ASP。NET不在乎。如果你想要一把锁然后等待,那就这样吧。ASP。NET既不想知道这个事实,也不能知道它是否想知道。对于系统来说,它看起来就像您的工作项花费了相当长的时间(因为它们阻塞了锁)。没有办法告诉ASP。NET调用您的交易系统串行。你必须自己建立这种协调。
可以看到,ASP内部的同步。NET类似于ASP.NET之外的同步。(我省略了一些细节)
首先,如果你需要一些真正快速的交易,忘记ASP吧。. NET并考虑使用套接字的客户机/服务器。是本市场常用的。
我认为对于你的问题,你应该考虑异步设计。每个web请求将订单发送到一个服务,该服务针对市场执行。这个"服务"可以是一个windows服务,您可以使用以下选项之一将所有交易排队到单个进程中:
1) ASP。. NET通过Socket向服务发送订单2)数据库(轮询很糟糕,但更容易实现)3) MSMQ或其他实现(RabbitMQ, Websphere MQ)。
另一种方法是同步ASP中的线程。. NET进程使用锁(看看c#中的"锁"保留字)。我不认为封锁ASP是个好主意。. NET线程等待订单执行。
也可以考虑HTML5 WebSockets。
但是考虑您的非功能需求。通常这种"低延迟"市场需要性能。