2013-06-06 202 views
2

我有一組Web服務每天擊中200萬次; 7個Web服務。 每個服務當前都會將傳入的XML消息放入磁盤(這是一個大磁盤)。Webservice - 線程與異步方法調用

文件丟失發生在請求的開始處,我想將它分散到一個新的線程中,這樣我就不會失去寫入文件所需的20ms。是的,那20ms比你想象的更重要。

我正在使用.NET 2.0,並想到了2種方法來做到這一點:異步方法調用DropMessage()方法,或啓動一個新的線程並調用它。

private void DumpMessage()// this method dumps the incoming message to File. 

DumpMessages管理它自己的業務。如果失敗,它知道該怎麼做,以及如何聯繫我的團隊。

public delegate void AsyncDumpMessage(); 
AsyncDumpMessage caller = new AsyncDumpMessage(DumpMessage); 
IAsyncResult result = caller.BeginInvoke(null, null); 

VS

System.Threading.Thread t = new System.Threading.Thread(DumpMessage); 
t.Start(); 

是否有什麼注意事項上述兩種?我傾向於異步方法,因爲通過我的測試,我已經獲得了更好的性能

有更好的方法做到這一點的其他想法?性能和穩定性對我而言至關重要。

+1

你爲什麼要使用.NET 2.0的工作,而不是4.0,這對線程管理更多的選擇(以TPL的形式)或者.NET 4.5(爲異步添加更多選項)? –

+0

歡迎使用企業醫療保健軟件... 您不需要告訴我4.0/4.5有更好的線程管理選項;) –

回答

1

我會用ThreadPool.QueueUserWorkItem來安排這項工作。

這將使用一個ThreadPool線程,它比啓動一個單獨的線程的開銷少。它還提出了一個「火警和遺忘」方法調用,其中異步委託調用建議您想要使用IAsyncResult

在一個更現代版本的框架,我會建議Task.Run,但這不會在.NET 2

+0

良好的通話 - 只需分析它。 00:00.0003153 - 500 Async Calls ... 00:00:00.0471381 - 500線程調用... 00:00:00.0000065 - 500 ThreadPool.QueueUserWorkItem calls ... –