Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web服务在.NET上是异步/同步的吗?_C#_.net_Web Services_Asynchronous - Fatal编程技术网

C# Web服务在.NET上是异步/同步的吗?

C# Web服务在.NET上是异步/同步的吗?,c#,.net,web-services,asynchronous,C#,.net,Web Services,Asynchronous,我从客户端调用WebService方法asmx 30次: for (var i = 0; i < 30; i++) { WSCustom.Test(i, function (res) { $("#Results").append(res + "<br />"); }, function (res) { $("#Result

我从客户端调用WebService方法asmx 30次:

for (var i = 0; i < 30; i++) {
    WSCustom.Test(i,
        function (res) {
            $("#Results").append(res + "<br />");
        }, 
        function (res) { 
            $("#Results").append(res.get_message() + "<br />"); 
        }
    );
}
我想要的是异步回复

我的意思是,我应该立即得到15个回复,其中奇数I立即返回,在这段时间内,其余回复需要时间下载页面服务器端

但事实上,输出是不同的:它立即处理第一个呼叫。然后,它等待第二次完成,然后我得到一些奇怪的回复,等等

所以它根本不是异步的

Web服务如何管理.NET中的客户端调用?我可以异步完成整个过程吗

编辑 如果EnableSession=false,则结果如下:

TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:1,514
TotalSeconds:0
TotalSeconds:1,857
TotalSeconds:0
TotalSeconds:2,143
TotalSeconds:0
TotalSeconds:1,88
TotalSeconds:0
TotalSeconds:3,178
TotalSeconds:0
TotalSeconds:3,562
TotalSeconds:2,095
TotalSeconds:0
TotalSeconds:0
TotalSeconds:4,221
TotalSeconds:1,749
TotalSeconds:0
TotalSeconds:0
TotalSeconds:3,717
TotalSeconds:0
TotalSeconds:1,977
TotalSeconds:2,421
TotalSeconds:2,439
TotalSeconds:1,807
TotalSeconds:2,124

因此,它不是会话错误。

它是异步的,因为该方法不会在javascript中阻塞,而是在操作完成时触发回调

它可以并行,也可以不并行,这与异步不同

请注意,大多数浏览器都会对发出的并发AJAX请求数量进行限制。你肯定不能同时发出30个请求。一般来说,你只会看到一些,1-3左右。这就是为什么您通常看到所有请求都是按顺序进行的,而不是所有请求都在同一时间返回。

您的webmethod上有EnableSession=true。这将有效地对调用进行排队,因为会话对象将针对每个请求被锁定

如果未使用会话,则不应启用它

发件人:

为了提供GetItemExclusive所需的排他性 会话状态提供程序必须实现一种锁定机制 防止两个或多个并发用户访问给定会话 需要对会话状态进行读/写访问的请求。该机制 通过防止并发会话,确保会话状态的一致性 请求相互覆盖对方的更改。锁定机构 即使会话状态数据源是远程资源,也必须工作 由多个Web服务器共享


WebService是由线程定义的。 如果遇到问题,请尝试在连接字符串中插入池大小=10或更多, 请注意,如果您有一个通用对象用途:

 lock (myObjList)
            {
                ...
            }

@markzzz如果您愿意,您可以使用工具嗅探自己的网络流量,自己查看。最有可能的是,浏览器指示它收到了执行AJAX查询的请求,但这并不意味着它立即发送了网络请求;它没有足够的精确度。使用秒表。这是主要问题,但Servy的回答中提出的观点也是相关的。你的浏览器不会像那样发出15个并发请求。虽然不能100%确定你最终要做什么,但你可以向服务器发出一个AJAX调用,让该调用使用TPL将多个请求排队,并在所有请求响应后返回。它们不一定都同时运行,这取决于线程池的设置方式,但比从浏览器发出30个请求要快。
 lock (myObjList)
            {
                ...
            }