2009-05-19 8 views
1

これらのスレッドが呼び出すスレッド12個の.functionは、オブジェクトによってはロックされていません。しかし、これらのスレッドは時間がかかりすぎています(16分)。各スレッドは、 indiviually.exisibleを実行してください。何らかの理由で、express版ではスレッドが提供されず、express版ではブロックされていません。各スレッドコールが以下に与えられるwhic FUNCのドットネット:エクスプレス版ビジュアルスタジオ2008でスレッドが遅すぎますか?


コード。 各スレッドは異なるrssfeed(urladdress)

public static class RssFileReader 
{ 
    public static Rss GetRssDocumentData(string rssFeed) 
    { 
     Console.WriteLine("thread in RssFileReader: " + Thread.CurrentThread.Name); 

     IFormatProvider culture = new CultureInfo("fr-FR", true); 

     Rss rssDocumentObject=new Rss(); 
     XmlDocument documentObj = new XmlDocument(); 
     try 
     { 
      documentObj.Load(HttpClient.GetWebResponse(@rssFeed, null, null, 1200000, @"http://www.sahil.com").GetResponseStream()); 
     } 
     catch(Exception e) 
     { 
      e.Source = "RssFileReader:Loading xmldocument object"; 
      throw; 
     } 
     try 
     { 
      XmlNodeList channelList = documentObj.GetElementsByTagName("channel"); 
      for (int k = 0; k < channelList.Count; k++) 
      { 

       rssDocumentObject.ListOfChannel.Add(new Channel()); 
       int noOfItemInChannel = -1; 
       //XmlNodeList itemList = channelList[k].ChildNodes; 
       for (int i = 0; i < channelList[k].ChildNodes.Count; i++) 
       { 


        switch (channelList[k].ChildNodes[i].Name) 
        { 

         case "item": 
          noOfItemInChannel++; 
          XmlNodeList xmlChildNodeOfItem = channelList[k].ChildNodes[i].ChildNodes; 
          //debugging 
          //Console.WriteLine("Thread Name in item in RssFileReader" + Thread.CurrentThread.Name); 

          rssDocumentObject.ListOfChannel[k].ListOfItem.Add(new Item()); 

          for (int j = 0; j < xmlChildNodeOfItem.Count; j++) 
          { 
           switch (xmlChildNodeOfItem[j].Name) 
           { 
            case "title": 
             rssDocumentObject.ListOfChannel[k].ListOfItem[noOfItemInChannel].ItemTitle.InnerText = xmlChildNodeOfItem[j].InnerText; 
             break; 
            case "link": 
             rssDocumentObject.ListOfChannel[k].ListOfItem[noOfItemInChannel].ItemLink.InnerText = xmlChildNodeOfItem[j].InnerText; 
             break; 
            case "description": 
             rssDocumentObject.ListOfChannel[k].ListOfItem[noOfItemInChannel].ItemDescription.InnerText = xmlChildNodeOfItem[j].InnerText; 
             break; 
            case "pubDate": 
             try 
             { 
              string dateTimeTemp = xmlChildNodeOfItem[j].InnerText; 
              char[] splitCharArray = new char[1]; 
              splitCharArray[0] = ' '; 
              string[] splitedDateTimeTemp = dateTimeTemp.Split(splitCharArray); 
              string RFC822 = "ddd,ddMMMyyyyHH:mm:ss"; 
              rssDocumentObject.ListOfChannel[k].ListOfItem[noOfItemInChannel].ItemPubDate.PublicationDate = DateTime.ParseExact(splitedDateTimeTemp[0] + splitedDateTimeTemp[1] + splitedDateTimeTemp[2] + splitedDateTimeTemp[3] + splitedDateTimeTemp[4], RFC822, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None); 
             } 
             //exception not rethrown default date is assigned 
             catch (Exception e) 
             { 
              //Console.WriteLine("Exception while formatting string to datetime in rssFileReader():" + e); 
             } 
             break; 
            case "guid": 
             rssDocumentObject.ListOfChannel[k].ListOfItem[noOfItemInChannel].ItemGuid.InnerText = xmlChildNodeOfItem[j].InnerText; 
             break; 


           } 
          } 
          break; 
         case "title": 
          rssDocumentObject.ListOfChannel[k].ChannelTitle.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "description": 
          rssDocumentObject.ListOfChannel[k].ChannelDescription.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "link": 
          rssDocumentObject.ListOfChannel[k].ChannelLink.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 

         case "language": 
          rssDocumentObject.ListOfChannel[k].ChannelLanguage.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "pubDate": 
          try 
          { 
           string dateTimeTempForChannel = channelList[k].ChildNodes[i].InnerText; 
           char[] splitCharArrayForChannel = new char[1]; 
           splitCharArrayForChannel[0] = ' '; 
           string[] splitedDateTimeTempForChannel = dateTimeTempForChannel.Split(splitCharArrayForChannel); 
           string formatStringForChannel = "ddd,ddMMMyyyyHH:mm:ss"; 
           rssDocumentObject.ListOfChannel[k].ChannelPubDate.PublicationDate = DateTime.ParseExact(splitedDateTimeTempForChannel[0] + splitedDateTimeTempForChannel[1] + splitedDateTimeTempForChannel[2] + splitedDateTimeTempForChannel[3] + splitedDateTimeTempForChannel[4], formatStringForChannel, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None); 
          } 
          //exception not rethrown default date is assigned 
          catch (Exception e) 
          { 
           //Console.WriteLine("Exception while formatting string to datetime in rssFileReader():" + e); 

          } 
          break; 
         case "lastBuildDate": 
          try 
          { 
           string dateTimeTempForChannel = channelList[k].ChildNodes[i].InnerText; 
           char[] splitCharArrayForChannel = new char[1]; 
           splitCharArrayForChannel[0] = ' '; 
           string formatStringForChannel = "ddd,ddMMMyyyyHH:mm:ss"; 

           string[] splitedDateTimeTempForChannel = dateTimeTempForChannel.Split(splitCharArrayForChannel); 
           rssDocumentObject.ListOfChannel[k].ChannelLastBuildDate.LastBldDate = DateTime.ParseExact(splitedDateTimeTempForChannel[0] + splitedDateTimeTempForChannel[1] + splitedDateTimeTempForChannel[2] + splitedDateTimeTempForChannel[3] + splitedDateTimeTempForChannel[4], formatStringForChannel, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None); 
          } 
          //exception not rethrown default date is assigned 
          catch (Exception e) 
          { 
           //Console.WriteLine("Exception while formatting string to datetime in rssFileReader():" + e); 

          } 

          break; 

         case "docs": 
          rssDocumentObject.ListOfChannel[k].ChannelDocs.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "generator": 
          rssDocumentObject.ListOfChannel[k].ChannelGenerator.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "managingEditor": 
          rssDocumentObject.ListOfChannel[k].ChannelManagingEditor.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "webMaster": 
          rssDocumentObject.ListOfChannel[k].ChannelWebMaster.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 
         case "ttl": 
          rssDocumentObject.ListOfChannel[k].ChannelTtl.InnerText = channelList[k].ChildNodes[i].InnerText; 
          break; 

        } 
       } 


      } 
     } 
     catch(Exception e) 
     { 
      e.Source = "RssFileReader:Reading xml document object data to rss object"; 
      throw; 
     } 
     Console.WriteLine(" Thread out RssFilereader :" + Thread.CurrentThread.Name); 
     return rssDocumentObject; 
    } 
} 

注意を与えられる:-whileデバッグ私はその撮影時間は、XML文書のロード中にいることを知りました。 システムにWeb要求オブジェクトの数の制限がありますか?

+1

ボトルネックはどこにありますか?おそらくネットワークアダプタがボトルネックの原因になっているかどうかを調べるために、ネットからではなくファイルから読み取ってみてください。 Expressは同じランタイムにコンパイルされているため、スレッド化に制限があるとは思われません。 – Thies

答えて

0

私はコンソールapplcationのfrのテストからそれを実行していた時間がかかっていた。 pintステートメントfrのデバッグのために時間がかかったのはioブロックだった。

3

同じサーバーにWeb要求を使用している場合、それらはデフォルトで2つの接続に一度に抑制されます。

レスポンスストリームとレスポンスストリームを破棄するのは失敗します。つまり、ガベージコレクションが完了するまで待ってから別の場所で使用できるように接続を解放します。あなたの読み込みコードを変更します。

try 
    { 
     // Removed unnecessary @ signs 
     using (WebResponse response = HttpClient.GetWebResponse(
        rssFeed, null, null, 1200000, "http://www.sahil.com")) 
     using (Stream responseStream = response.GetResponseStream()) 
     { 
      documentObj.Load(responseStream); 
     } 
    } 
    catch(Exception e) 
    { 
     e.Source = "RssFileReader:Loading xmldocument object"; 
     throw; 
    } 

それはあなたが唯一のWeb応答をクローズする必要があることが可能です - ストリームが世話をされることを応答を閉じて - しかし、それは確かに良いでしょう。

同じサーバーへの接続を同時に使用するスレッドは2つしかありません(デフォルトでは、非ASP.NETの場合はServicePointManager.DefaultConnectionLimitまたはconnectionManagement config file elementを使用して変更できます)。接続が空いている間、またはガベージコレクションを待っている間、待つ必要はありません。

+0

ダウンリスト:理由を挙げてください。 –

関連する問題