我有2个ASP.net 3.5 asmx Web服务,ws2和ws3。它们分别包含操作op21和op31。 op21睡觉2秒和op31睡3秒。我想在异步情况下在网络服务中调用op11中的op21和op31,同时调用ws1。这样,当我同步地从客户端呼叫op11时,所花费的时间将是总共3秒。我目前得到5秒与此代码:c#.net 3.5中的多线程异步Web服务调用
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?你在用什么线程?我得到一个STA threa不受支持异常当我尝试运行您的代码(用Action.BeginInvoke替换您的Web调用)。 – Aron 2013-03-12 05:12:00
你运行的是什么版本的.net?使用TPL(.net 4或更高版本)可能是一种更优雅的方式,它也更具可读性。 – 2013-03-12 05:27:20
@Aron它们是通过添加服务引用自动生成的SOAP客户端。该服务是使用c#构建的。以下是2个服务/操作,都已部署在本地主机/ IIS上。 公共字符串OP31() { Thread.Sleep(3000); 返回“OP31完成”; } 公共字符串OP21() { Thread.Sleep(2000); 返回“OP21完成”; } – Bowofola 2013-03-12 19:07:36