2011-10-06 45 views
1

我的.Net和Java應用程序需要同時向Web服務發出多個請求,這需要很長的時間來回復。因此,任何時候都可能有數千個未完成的HTTP請求。爲了實現這一點,我可以讓一個線程生成許多異步HTTP請求並處理響應,但我想了解任何允許同步HTTP請求的替代方法,因爲相關的資源成本而不需要使用數千個線程。任何解決方案都必須避免被阻塞的線程等待HTTP響應。對於許多同時的http請求是否有很好的線程模型?

我的問題有兩個部分:

1)可線程池來做到這一點?我知道我可以將我的作業排列在線程池隊列中,並且線程池將在它能夠處理時處理它們,但線程池工作線程可以避免被阻塞等待http響應嗎?他們可以在等待時處理其他工作嗎?

2)有沒有其他的方式可以實現這一點,同時保留HTTP同步API調用的簡單性。

問候

+0

「我的.Net和Java應用程序」 - 它真的在一個進程中?或者它可以嗎?或者你有兩種口味的單一應用程序? –

+0

我有一個C#和同一個應用程序的Java版本。 –

+0

看看[JBoss Netty](http://www.jboss.org/netty)或[Apache MINA](http://mina.apache.org/) –

回答

1

能的線程池來做到這一點?

本身,沒有。

有沒有其他方法可以實現這一點,同時保留HTTP同步API調用的簡單性。

您是否在談論客戶端 HTTP調用API?如果是這樣,有一種方法可以做到這一點,通過使用異步服務器端實現。

+0

它是客戶端...我會看在鏈接。 –

1

任務不產生額外的線程,所以你保存了性能命中,並且它們不會阻塞調用線程,所以我相信這將滿足這兩個需求。

string[] urls = GetUrls(); 
var requests = new Dictionary<string, Task<string>>() 
var responses = new Dictionary<string, string>(); 

// send off each request and store the on-going task in a dictionary 
foreach (string url in urls) 
    requests.Add(url, Task.Factory.StarNew(() => return WebClient.DownloadString(url)) 

// get the results asynchronously 
Task.Factory.StartNew(() => { 
    foreach (var request in requests) 
     responses.Add(request.key, request.Result) 
} 

現在,當您得到回覆時,您可以通過幾種方法來完成。以上將逐一得到每項任務的結果。當你調用結果時,它將等待任務完成,阻止調用方法,並且如果任務故障,將在此時拋出異常。您也可以使用Task.WaitAll()立即等待整個批處理;由於調用.Result會阻止調用方法,因此您必須從任務中檢索結果。

該示例假設您發送HTTP-GET並希望以字符串形式輸出結果,但無論您想要的HTTP方法或結果如何,您進行調用的方式和結果都是相同的。您還希望添加異常處理以捕獲可能拋出的任何異常。您可以準備好關於任務異常處理here

相關問題