我有我的WebMethod
:
[WebMethod(true)]
[SoapHeader("Header")]
public string GetStatementNotDownloadedAsync(string uniqueId, string type)
当我发送50个并发请求到这个端点时,它们被一个接一个地处理。
为什么?
这与点击按钮并等待回复没有什么不同。
JavaScript(客户端)是异步的,但是服务器端必须处理来自浏览器会话的每个请求。
你混淆了线程处理和并行处理。它们是非常不同的概念。记住,你可以用一个处理器运行一个web服务器!!
一些开发人员陷入了将多线程等同于并行的陷阱。这是不准确的。你可以在单核机器上使用多线程,但是你只能在多核机器上使用并行。
因此,在大多数情况下,web服务器将为不同的用户使用多个内核(并行处理)。但是,对于ONE用户来说,您实际上只有一个线程模型,如果您想并行运行每个ajax调用,那么您必须编写在服务器上启动新进程线程的代码。(但是返回一个值会相当困难)。事实上,你的浏览器是一个线程模型。它不能同时做两件事!-但公平地说,浏览器现在可以使用多个核心,但一般来说,浏览器将使用一个CPU,甚至包括当它下载说多个图像显示。
实际发生的是每个"图像请求"顺序发生(每个请求都很小,花费的时间很少)。现在,所有的请求都"完成"了。然后web服务器可以开始推出多个请求,这可以是并行的和线程的,甚至不是并行处理(每个图像流从浏览器得到一些线程处理-当这种情况发生时,它不是并行多CPU处理)。
因此,来自JavaScript的ajax调用是线程化的。发出客户端js代码请求,JavaScript代码继续运行该请求,然后完成其例程和ajax调用。然后ajax返回回调,并返回"success"例程然后调用/run客户端)。所以web服务器"end point"可以处理多个请求-但那将是来自不同的用户-而不是单个用户-从单个用户,他们排队,并一个接一个地运行。
问题不在于请求!-问题是在每个请求发出后进行工作和处理!-那些在线程模型上运行的,而不是并行模型。