विकल्प 3 सबसे अच्छा है:
Async IO का उपयोग करें।
जब तक आपका अनुरोध प्रसंस्करण जटिल और भारी न हो, आपका प्रोग्राम HTTP अनुरोधों के लिए 99% समय व्यतीत करने जा रहा है।
यह वही है जो Async IO के लिए डिज़ाइन किया गया है - विंडोज नेटवर्किंग स्टैक (या .नेट फ्रेमवर्क या जो कुछ भी) सभी प्रतीक्षाों के बारे में चिंता करें, और केवल एक थ्रेड का उपयोग प्रेषण के लिए करें और परिणामों को 'उठाएं'।
दुर्भाग्य से .NET ढांचा इसे गधे में सही दर्द बनाता है। यदि आप कच्चे सॉकेट या Win32 एपीआई का उपयोग कर रहे हैं तो यह आसान है। यहां एक (परीक्षण किया गया) उदाहरण है, वैसे भी सी # 3 का उपयोग कर:
using System.Net;//need this somewhere
// need to declare an class so we can cast our state object back out
class RequestState {
public WebRequest Request { get; set; }
}
static void Main( string[] args ) {
//stupid cast neccessary to create the request
HttpWebRequest request = WebRequest.Create( "http://www.stackoverflow.com" ) as HttpWebRequest;
request.BeginGetResponse(
/* callback to be invoked when finished */
(asyncResult) => {
//fetch the request object out of the AsyncState
var state = (RequestState)asyncResult.AsyncState;
var webResponse = state.Request.EndGetResponse( asyncResult ) as HttpWebResponse;
//there we go;
Debug.Assert( webResponse.StatusCode == HttpStatusCode.OK );
Console.WriteLine( "Got Response from server:" + webResponse.Server );
},
/* pass the request through to our callback */
new RequestState { Request = request }
);
//blah
Console.WriteLine( "Waiting for response. Press a key to quit" );
Console.ReadKey();
}
संपादित करें:
.NET के मामले में, 'समापन कॉलबैक' वास्तव में थ्रेडपूल थ्रेड में निकाल दिया जाता है, न कि आपके मुख्य थ्रेड में, इसलिए आपको अभी भी किसी भी साझा संसाधन को लॉक करने की आवश्यकता होगी, लेकिन यह आपको अभी भी थ्रेड प्रबंधित करने की सभी परेशानी बचाता है।