2011-04-29 72 views
3

我有一個接受XML文件傳輸的ASP.NET 4.0 Web服務。在過去(使用相同Web服務的不同實現),我們使用時間戳跟蹤了併發性(同時接收/處理的XML文件的數量)。我已經在Web服務的新版本,例如複製此行爲:跟蹤具有時間戳的併發Web服務請求

在構造函數中的Web服務類使用我HttpContext.Current.Timestamp

public class MyWebService : System.Web.Services.WebService 
{ 
    public MyWebService() 
    { 
    ConnectionStartTime = HttpContext.Current.Timestamp 
    } 
} 

記錄ConnectionStartTime我做處理中的XML文件後WebMethod我將文件插入數據庫(記錄ConnectionEndTime)並將響應返回給用戶。我在新的Thread中執行數據庫插入,因此最終用戶不必等待插入發生才能收到其響應。

new Thread (() => 
    { 
    insertIntoDatabase(ConnectionStartTime, ConnectionEndTime=Datetime.Now, xmlFile); 
    }).Start(); 
return responseToUser; 

現在我想要衡量我們多少個併發XML傳輸兩種方法達到:

1.性能計數器

  • ASP.NET應用程序V4.0 \ Requests Executing - 此計數器達到峯值52.
  • ASP.NET Apps v4.0 \ Requests Queued - 此計數器達到峯值19.

對我來說,這意味着我應該看到一個點,我們有33個記錄重疊ConnectionStartTimeConnectionEndTime

2.查詢反對時間戳 - 在this question我引用我使用來計算基於ConnectionStartTimeConnectionEndTime並行傳輸的數量查詢。這些是SQL Server數據庫中的datetime字段。 注意:該問題中的查詢是我們在過去3年中用來確定併發性的算法的返工版本,因此它可能不是100%正確的,但算法的其他實現(Excel宏等)已經過驗證。

我的問題是兩個方法永遠不會對齊。查詢時間戳的最大結果爲10,而性能計數器顯示最大值應爲30+。我很難找到差異在哪裏。我在記錄時間戳的過程中犯了錯誤嗎? HttpContext.Current.Timestamp值是否不記錄傳輸到Web服務的開始? 。

+0

不確定是否相關,但是......除非您有一個真正的好理由,否則不要在ASPNET中使用Thread.Start()。使用線程池。 http://stackoverflow.com/questions/684640/advantage-of-using-thread-start-vs-queueuserworkitem – Cheeso 2011-04-29 15:01:59

+0

感謝您的提示。不確定它是否影響時間戳問題,但仍有改進。 – 2011-04-29 15:13:00

回答

0

使用線程啓動將導致你的數據和ASP.NET計數器(主要是因爲這樣,你寫你的線程函數之間的差異我將其更改爲:

DateTime EndTime = DateTime.Now 
new Thread (() => 
{ 
    insertIntoDatabase(ConnectionStartTime, ConnectionEndTime=EndTime, xmlFile); 
}).Start(); 
return responseToUser; 

不知道它是唯一的差異來源,但是通過代碼,您可以測量處理請求所需的時間,並啓動線程並向數據庫發出命令以記錄時間。

我的代碼測量時間只有在旋轉線程之前捕獲閉包中的endtime才能處理請求,它應該更接近ASP。 NET性能計數器。不知道它是否會解決整個差異,但它應該有所幫助。

我同意以前的評論者,你不應該像這樣的每一個請求開始一個新的線程。旋轉新線程需要時間並且非常耗費內存。如果這是一個高性能的應用程序,它肯定會有效果。使用QueueUserWorkItem會更好,雖然使用ThreadPool帶有它自己的一組關注和限制。

作爲最終評論,您使用的模式有一些其他潛在的問題,這些問題會隨着請求率的增加而變化(排隊,併發和瓶頸問題)。我敢打賭,在目前的實施中,差異會隨着請求率的增長而增長。如果這是一個高性能或性能敏感的應用程序,我會使用不同的方法來完全測量併發性。