मैं पिछले 2 दिनों में सी # async विधियों के बारे में पढ़ रहा हूं और जो मैं समझता हूं, उससे (threadpool.queueuserworkitem())
धागे के विपरीत, एसिंक विधि के लिए एक कॉल तत्काल वापस नहीं आता है और यह केवल तब लौटाता है जब कॉल की गई विधि एक प्रतीक्षा या पूर्ण (या अपवाद)Async प्रोग्रामिंग नियंत्रण प्रवाह
कृपया निम्नलिखित उदाहरण देखें।
public partial class MainWindow : Window
{
// . . .
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// ONE
Task<int> getLengthTask = AccessTheWebAsync();
// FOUR
int contentLength = await getLengthTask;
// SIX
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
}
async Task<int> AccessTheWebAsync()
{
// TWO
HttpClient client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("http://msdn.microsoft.com");
// THREE
string urlContents = await getStringTask;
// FIVE
return urlContents.Length;
}
}
से मैं क्या इकट्ठा होते हैं, उपरोक्त कोड में, AccessTheWebAsync()
तुल्यकालिक कहा जाता है (अर्थात। नियंत्रण तुरंत जब यह कहा जाता है वापस नहीं करता है)। लेकिन 'थ्री' नाम की लाइन में, रनटाइम नियंत्रण वापस कर देगा।
मेरे प्रश्न हैं:
कैसे जब ThreadPool उपयोग करने के लिए या जब बुला धागे में काम चलाने के लिए क्रम तय करता है? (यानी नियंत्रण लौटने के बिना कोड निष्पादित करें)
उपर्युक्त कोड में कौन से बिंदु, नए धागे (या थ्रेड पूल) का उपयोग किया जाएगा?
यदि
AccessTheWebAsync()
ने कुछ अनुवांशिक रूप से गहन किया, तो एक अरब प्रतिरक्षण के साथ एक लूप चलाने की तरह, नियंत्रण केवल लूप पूरा होने पर कॉलर पर वापस आ जाएगा। क्या वह सही है?एसिंक फ़ंक्शन में, क्या नियंत्रण तुरंत वापस करने का एक तरीका है और फिर पृष्ठभूमि थ्रेड कहने में काम करना जारी रखें? (जैसे कि हम threadpool.queueuserworkitem())
एक एसिंक विधि को कॉल करने के बिना एक एसिंक विधि को कॉल कर रहा है (यह संभव है मान लें) एक गैर async विधि को कॉल करने के समान?