【发布时间】:2013-03-12 03:55:15
【问题描述】:
我有 2 个 ASP.net 3.5 asmx 网络服务,ws2 和 ws3。它们分别包含操作 op21 和 op31。 op21 休眠 2 秒,op31 休眠 3 秒。我想在 Web 服务 ws1 中从 op11 异步调用 op21 和 op31。这样当我从客户端同步调用 op11 时,所花费的时间将是 3 秒,这是总时间。我目前使用此代码获得 5 秒:
WS2SoapClient ws2 = new WS2SoapClient();
WS3SoapClient ws3 = new WS3SoapClient();
//capture time
DateTime now = DateTime.Now;
//make calls
IAsyncResult result1 = ws3.BeginOP31(null,null);
IAsyncResult result2 = ws2.BeginOP21(null,null);
WaitHandle[] handles = { result1.AsyncWaitHandle, result2.AsyncWaitHandle };
WaitHandle.WaitAll(handles);
//calculate time difference
TimeSpan ts = DateTime.Now.Subtract(now);
return "Asynchronous Execution Time (h:m:s:ms): " + String.Format("{0}:{1}:{2}:{3}",
ts.Hours,
ts.Minutes,
ts.Seconds,
ts.Milliseconds);
预期结果是两个请求的总时间应该等于执行较慢请求的时间。
请注意,当我使用 Visual Studio 调试它时,这可以正常工作,但是在 IIS 上运行它时,时间是 5 秒,这似乎表明请求没有同时处理。
我的问题是,是否需要正确设置 IIS 和 ASMX Web 服务的特定配置才能使其按预期工作?
【问题讨论】:
-
你在哪里实现 WSxSoapClient?你用的是什么线程?当我尝试运行您的代码(用 Action.BeginInvoke 替换您的网络调用)时,我得到一个 STA threa is not supported 异常。
-
您运行的是哪个版本的 .net?使用 TPL(.net 4 或更高版本)可能是一种更优雅的方式,也更具可读性。
-
@Aron 它们是通过添加服务引用自动生成的 SOAP 客户端。该服务是使用 c# 构建的。这是 2 个服务/操作,它们都已经部署在 localhost/IIS 上。公共字符串 OP31() { Thread.Sleep(3000);返回“OP31 完成”; } 公共字符串 OP21() { Thread.Sleep(2000);返回“OP21 完成”; }
-
@DavidKhaykin .NET 3.5
-
你是在本地机器还是服务器上测试这个?
标签: c# .net web-services asynchronous