最近使用多線程同時調用一個Web Service,總是有很多調用報逾時,代碼類似於下面的代碼(為了簡化,我把調用Web Service改為使用HttpWebRequest訪問一個網址,效果時一樣的):
我迴圈調用100次,但是總是有幾十次調用報逾時,具體如下:
System.Net.WebException: 操作已逾時。
at System.Net.HttpWebRequest.GetResponse()
at HttpRequestTest.HttpRequestTest.MakeWebRequest(Object obj) in g:\my documents\visual studio projects\httprequesttest\httprequesttest.cs:line 35
真的不知道為什麼,難道Web Service就不能在多線程的環境下調用!
因為目前找不到原因,暫時放在首頁,想向各位請教,明天就撤調,請手下留情,謝謝!
1using System;
2using System.Diagnostics;
3using System.Net;
4using System.Threading;
5
6namespace HttpRequestTest
7{
8 /**//// <summary>
9 /// Class1 的摘要說明。
10 /// </summary>
11 class HttpRequestTest
12 {
13
14 //[STAThread]
15 static void Main(string[] args)
16 {
17 for(int i = 0; i < 100; i++ )
18 {
19 ThreadPool.QueueUserWorkItem(new WaitCallback(MakeWebRequest),"http://www.163.com");
20 }
21 Console.ReadLine();
22 }
23
24 private static void MakeWebRequest (object obj)
25 {
26 string url = obj as string;
27 HttpWebResponse res = null;
28 try
29 {
30 HttpWebRequest req = (HttpWebRequest)WebRequest.Create (url);
31 req.Timeout = 15000;
32
33 Console.WriteLine ("\nConnecting to " + url + " ");
34
35 res = (HttpWebResponse)req.GetResponse ();
36
37 Console.WriteLine("[" + AppDomain.GetCurrentThreadId() + "] ContentLength:" + res.ContentLength);
38 Console.WriteLine ("Connected.\n");
39
40
41 }
42 catch (Exception e)
43 {
44 Console.WriteLine ("Source : " + e.Source);
45 Console.WriteLine ("Message : " + e.Message);
46 Console.WriteLine(e.ToString());
47 Debug.WriteLine(e.ToString());
48 //Console.WriteLine("StackTrace :" + e.StackTrace);
49 }
50 finally
51 {
52 if (res != null)
53 {
54 res.Close ();
55 }
56 }
57 }
58 }
59}
60