我有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