2009-05-19 37 views
1

我正在運行12個線程。這些線程調用的函數沒有對某個對象進行任何鎖定,但仍然這些線程花費了太多時間(16分鐘)。每個線程都分析正在運行的xml文檔,如果if個別運行。這個問題是由於某些原因相關最大沒有線程提供的快遞版本或某些封鎖dn的快遞版本。dot net:Express版本的Visual Studio 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文檔,它的服用時間。 對於webrequest對象的數量是否有任何限制?

+1

您是否嘗試過找到瓶頸?嘗試從文件中讀取數據,而不是從網絡讀取數據,以查看網絡適配器是否可能導致瓶頸。 我不認爲Express中的線程存在限制,因爲代碼被編譯到相同的運行時。 – Thies 2009-05-19 14:44:14

回答

0

當我從控制檯應用程序運行它測試時,它需要時間。 原因很多時間是由於品脫語句fr調試io阻塞。

3

如果您對同一臺服務器使用Web請求,則默認情況下,這些服務器一次會被限制爲兩個連接。

然後,您無法處理響應和響應流,這意味着它會一直等到垃圾收集後釋放連接以供其他地方使用。您加載代碼更改爲:

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; 
    } 

這可能是因爲你只需要關閉網頁的響應 - 通過關閉響應,該流將被照顧 - 但最好是肯定的。

你仍然只獲得使用在同一時間到同一臺服務器連接兩個線程(默認情況下,爲non-ASP.NET;你可以改變這個自己使用ServicePointManager.DefaultConnectionLimitconnectionManagement config file element),但至少你贏了當連接閒置或等待垃圾收集時,無需等待。

+0

Downvoters:請說明理由。 – 2009-05-20 06:04:31

相關問題