2016-09-16 18 views
0

У меня есть проект, где я должен показать время запроса на сервер. используются Несколько Секундомеры:Общий выпуск времени секундомера

1) Для получения ответа Webservice (TechDoctimer)

2) Для получения ответа дБ (dbTimer)

3) Для получения общего времени выполнения функции (таймер), этот таймер «самый большой», все остальные таймеры вложены в его производительность.

Так что в итоге я должен получить 2 номера (от дб и Techdoc секундомера), сумма которых будет меньше timer, но я получаю что-то вроде этого:

время общего ответа

сервера : 1.351 (в секундах)

Techdoc общее время отклика: 1,215 (в секундах)

цены База данных общее время отклика: 0.67 (секунды)

Как вы можете видеть TechDoc + База данных > Общее время отклика сервера. Я не могу понять, как это могло произойти, если только Visual Studio не выполняет потоки самостоятельно.

Вот код моей функции:

public static FullModel GetDetailList(string article) 
    { 
     Stopwatch timer = new Stopwatch(); 
     timer.Start(); 
     Stopwatch dbTimer = new Stopwatch(); 
     Stopwatch TechDoctimer = new Stopwatch(); 

     var db = new TecAllianceEntities(); 
     FullModel model = new FullModel(); 
     model.details = new List<DetailModel>(); 
     List<string> listOfNo = new List<string>(); 
     int articleId; 

     TechDoctimer.Start(); 
     List<int> listOfIdsFound = RequestDetailIdByArticle(article); 
     TechDoctimer.Stop(); 


     foreach (var item in listOfIdsFound) 
     { 
      DetailModel detail = new DetailModel(); 
      detail.oeNumberList = new List<OENumberModel>(); 
      detail.documents = new List<DocumentModel>(); 
      detail.attributeList = new List<AttributeModel>(); 

      articleId = item; 

      TechDoctimer.Start(); 
      string resultFromRequestDetailById = TecAllianceResponce.RequestDetailByIds(articleId); 
      TechDoctimer.Stop(); 

      var result = TecAllianceResponce.GetSorted(resultFromRequestDetailById); 

      for (int i = 0; i < result.Count; i++) 
      { 
       switch (result[i]) 
       { 
        case "articleId": 
         detail.articleId = Int32.Parse(result[i + 1]); 
         break; 

        case "articleName": 
         detail.articleName = result[i + 1]; 
         break; 

        case "articleNo": 
         detail.articleNo = result[i + 1]; 
         listOfNo.Add(result[i + 1]); 
         break; 

        case "articleStateName": 
         detail.articleStateName = result[i + 1]; 
         break; 

        case "brandName": 
         if (result[i - 2] == "articleStateName") 
          detail.brandName = result[i + 1]; 
         break; 

        case "packingUnit": 
         detail.packingUnit = Int32.Parse(result[i + 1]); 
         break; 

        case "quantityPerPackingUnit": 
         detail.quantityPerPackingUnit = Int32.Parse(result[i + 1]); 
         break; 

        case "docId": 
         detail.hasDocuments = result[i + 1] != "0" ? true : false; 
         DocumentModel newDoc = new DocumentModel() 
         { 
          docId = Int32.Parse(result[i + 1]), 
          docFileName = result[i - 1], 
          docTypeName = result[i + 5] 
         }; 
         newDoc.docURL = "http://webservicepilot.tecdoc.net/pegasus-3-0/documents/367/" + newDoc.docId + "/" + 0; 
         detail.documents.Add(newDoc); 
         break; 

        case "oeNumber": 
         detail.hasDocuments = result[i + 1] != "0" ? true : false; 
         OENumberModel newOE = new OENumberModel() 
         { 
          brandName = result[i - 1], 
          oeNumber = result[i + 1] 
         }; 
         detail.oeNumberList.Add(newOE); 
         break; 

        case "attrName": 
         AttributeModel newAttr = new AttributeModel() 
         { 
          attrName = result[i + 1] 
         }; 
         for (int j = i; j <= i + 12; j++) 
         { 
          if (result[j] == "attrValue") newAttr.attrValue = result[j + 1]; 
          if (result[j] == "attrUnit") newAttr.attrUnit = result[j + 1]; 
         } 
         if (newAttr.attrUnit == null) newAttr.attrUnit = ""; 
         detail.attributeList.Add(newAttr); 
         break; 
       } 
      } 
      model.details.Add(detail); 
     } 

     dbTimer.Start(); 
     if (listOfNo.Any()) 
     { 
      var queryPrices = db.PRECES.Where(p => listOfNo.Contains(p.RAZOTAJA_KODI)).Select(p => new { p.RAZOTAJA_KODI, p.REALIZ_CENA }).ToList(); 
      dbTimer.Stop(); 
      foreach (var item in model.details) 
      { 
       try 
       { 
        item.price = queryPrices.Where(q => q.RAZOTAJA_KODI == item.articleNo).Select(q => q.REALIZ_CENA).First(); 
       } 
       catch 
       { 
        item.price = 0; 
       } 
      } 
     } 
     else 
     { 
      dbTimer.Stop(); 
     } 

     timer.Stop(); 
     TimeSpan timeTaken = timer.Elapsed; 
     TimeSpan TechDocUsageTime = TechDoctimer.Elapsed; 
     TimeSpan dbRequestTime = dbTimer.Elapsed; 

     model.dbTimeTaken = dbRequestTime.Seconds + "." + dbRequestTime.Milliseconds; 
     model.TimeTaken = timeTaken.Seconds + "." + timeTaken.Milliseconds; 
     model.TimeTechDoc = TechDocUsageTime.Seconds + "." + TechDocUsageTime.Milliseconds; 

     return model; 
    } 
} 
+2

Попробуйте использовать 'model.dbTimeTaken = dbRequestTime.TotalSeconds + "." + dbRequestTime.Milliseconds '. Второе свойство содержит секунды текущей минуты. Так что, если это займет больше минуты, у вас будет неправильный результат. –

+1

Точно о чем я думал. Просто используйте свойство TotalSeconds для TimeSpan вместо объединения секунд и миллисекунд. Также проверьте документацию: https://msdn.microsoft.com/en-us/library/system.timespan.seconds(v=vs.110).aspx –

+0

Требуется меньше 5 секунд, обычно около 2-3 секунд. – GeekyNuns

ответ

1

Видя, как вы сохраняете результат в строку, то почему бы вам не просто использовать() выход TimeSpan.ToString?

Смежные вопросы