2016-08-02 17 views
0

各スレッド(1スレッドあたり1つのXMLデータファイル)で複数のxmlファイルをWebサーバーに送信しようとしています。私が問題になっているように見えるのは、ファイルが1つしか送信されず、接続が閉じているということです。つまり、スレッドは同じ接続ストリームを使用しています。私は自分のtry/catchコードで、スレッドごとに新しい接続を作成するようにする必要があるので、それらは独立した接続ですが、私はすでにそれをやっていると思いますが、なぜ接続を閉じて応答を受信しないのかわかりませんWebサーバーからは、最初の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"を呼び出して新しい接続を作成します。 –

+0

[複数のWebRequestをParallel.Forで送信する](http://stackoverflow.com/questions/7477261/send-multiple-webrequest- in-parallel-for) – Sinatr

+0

それはそれではありません? try catchの部分では、各スレッドで実行されますか?それはとにかく新しいものを作るべきではありませんか?それは – Freon

答えて

1

あなたのコードは、ちょうどこのビットが

交換してください何が起こるか見て微調整し、OKらしい:付き

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が処理され、2番目に接続が閉じられますが、時には両方とも機能しますか?サーバはそれを再テストする前に接続を速く閉じることはできませんか? – Freon

+0

3つのXMLファイルを使ってテストしました。最初の2つのスレッドが送信され、Webサーバから応答が返され、3番目の場合は強制的な接続クローズ例外が返されます。 – Freon

+0

あなた自身がサーバー側を実装しましたか?その場合はそのコードをコピーしてください。スレッド内に別々の 'request'オブジェクトを作成して、干渉しないようにしています。ちなみに、私はコードを微調整してみました。 – akazemis

関連する問題