2016-08-02 66 views
0

我想在每个线程(每个线程1个XML数据文件)发送到Web服务器的多个XML文件。我似乎得到的问题是,它只发送一个文件,连接关闭,这意味着线程正在使用相同的连接流。我需要做什么在我的try/catch代码,以确保它为每个线程创建一个新的连接,所以他们是独立的连接,但我认为即时通讯已经这样做,但我不知道为什么它保持关闭连接,并没有收到响应从网络服务器,它只响应第一个XML线程,有时它响应所有。多线程的Web请求使用相同的连接

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Xml; 

namespace XMLSender 
{ 
    class Program 
    { 
     private static string serverUrl; 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please enter the URL to send the XML File"); 
      serverUrl = Console.ReadLine(); 


      List<Thread> threads = new List<Thread>(); 
      List<string> names = new List<string>(); 
      string fileName = ""; 

      do 
      { 
       Console.WriteLine("Please enter the XML File you Wish to send"); 
       fileName = Console.ReadLine(); 
       if (fileName != "start") 
       { 
        Thread t = new Thread(new ParameterizedThreadStart(send)); 
        threads.Add(t); 
        names.Add(fileName); 
       } 
      } 
      while (fileName != "start"); 

      foreach (Thread t in threads) 
      { 
       t.Start(names[0]); 
       names.RemoveAt(0); 
      } 
      foreach (Thread t in threads) 
      { 
       t.Join(); 
      } 

     } 
     static private void send(object data) 
     { 
      try 
      { 
       //Set the connection limit of HTTP 
       System.Net.ServicePointManager.DefaultConnectionLimit = 10000; 

       //ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };    
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(serverUrl)); 

       byte[] bytes; 

       //Load XML data from document 
       XmlDocument doc = new XmlDocument(); 
       doc.Load((string)data); 
       string xmlcontents = doc.InnerXml; 

       //Send XML data to Webserver 
       bytes = Encoding.ASCII.GetBytes(xmlcontents); 
       request.ContentType = "text/xml; encoding='utf-8'"; 
       request.ContentLength = bytes.Length; 
       request.Method = "POST"; 
       Stream requestStream = request.GetRequestStream(); 
       requestStream.Write(bytes, 0, bytes.Length); 
       requestStream.Close(); 

       // Get response from Webserver 
       HttpWebResponse response; 
       response = (HttpWebResponse)request.GetResponse(); 
       Stream responseStream = response.GetResponseStream(); 
       string responseStr = new StreamReader(responseStream).ReadToEnd(); 
       Console.Write(responseStr + Environment.NewLine); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine("An Error Occured" + Environment.NewLine + e); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 
+0

然后调用“WebRequest.Create”创建一个新的连接... – 2016-08-02 13:21:52

+0

[Parallel.For发送多个WebRequest]的可能的重复(http://stackoverflow.com/questions/7477261/send-multiple-webrequest- in-parallel-for) – Sinatr

+0

它没有吗?在每个线程上运行的try catch部分?无论如何它不应该创建一个新的?但它没有 – Freon

回答

1

您的代码看起来不错,只是调整该位看个究竟

替换:

foreach (Thread t in threads) 
{ 
    t.Start(names[0]); 
    names.RemoveAt(0); 
} 

有了:

for(int i = 0; i < threads.Count; i++)) 
{ 
    var t= threads[i]; 
    var name=names[i]; 
    t.Start(name); 
} 

我怀疑,在比赛中状态那一点。

+0

好吧我改变了它,第一个xml通过,第二个导致连接关闭,但有时它同时工作吗?也许我的测试速度太快在我重新测试之前,服务器没有足够快地关闭连接? – Freon

+0

好吧,我测试了3个XML文件,并且前两个线程被发送并从Web服务器接收响应,第三个返回强制连接关闭异常。我觉得它决定做它想要的。 – Freon

+0

很酷,你是否自己实现了服务器端?那么请复制该代码。你正在线程中创建单独的'request'对象,所以它们不应该干涉。顺便说一下,我调整了代码给它一个尝试以及 – akazemis