मैंने सोचा था कि वे मूल रूप से एक ही चीज थे - प्रोग्राम लिखना जो प्रोसेसर के बीच कार्यों को विभाजित करते हैं (मशीनों पर 2+ प्रोसेसर हैं)। तब मैं पढ़ रहा हूँ इस है, जो कहते हैं:
Async पद्धतियों का उद्देश्य गैर-अवरोधक संचालन होना है। एक async विधि में एक प्रतीक्षित अभिव्यक्ति वर्तमान थ्रेड को ब्लॉक नहीं करती है जबकि प्रतीक्षित कार्य चल रहा है। इसके बजाय, अभिव्यक्ति शेष विधि को एक निरंतरता के रूप में संकेत देती है और एस्किंस विधि के कॉलर को नियंत्रण लौटाती है।
Async और प्रतीक्षा कीवर्ड के कारण अतिरिक्त थ्रेड्स का निर्माण नहीं होता है। Async विधियों के लिए मल्टीथ्रेडिंग की आवश्यकता नहीं है क्योंकि एक async विधि अपने स्वयं के थ्रेड पर नहीं चलती है। विधि वर्तमान सिंक्रनाइज़ेशन संदर्भ पर चलती है और थ्रेड पर समय का उपयोग केवल तब होता है जब विधि सक्रिय होती है। CPU- बाउंड वर्क को बैकग्राउंड थ्रेड में ले जाने के लिए आप Task.Run का उपयोग कर सकते हैं, लेकिन एक बैकग्राउंड थ्रेड ऐसी प्रक्रिया से मदद नहीं करता है, जो परिणाम उपलब्ध होने का इंतजार कर रही है।
और मैं सोच रहा हूं कि क्या कोई मेरे लिए अंग्रेजी में अनुवाद कर सकता है। यह एसिंक्रोनसिटी (क्या यह एक शब्द है?) के बीच एक अंतर आकर्षित करता है और थ्रेडिंग और इसका मतलब है कि आपके पास एक प्रोग्राम हो सकता है जिसमें एसिंक्रोनस कार्य होते हैं लेकिन कोई मल्टीथ्रेडिंग नहीं है।
अब मैं अतुल्यकालिक कार्यों के विचार को समझता हूं जैसे पीजी पर उदाहरण। जॉन स्कीट के सी # में 467 गहराई, तीसरा संस्करण
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
asyncकीवर्ड का अर्थ है " यह समारोह, जब भी यह कहा जाता है, एक संदर्भ में इसके पूरा होने के लिए सब कुछ के लिए आवश्यक है इसके कॉल के नाम से जाना के बाद में कहा जाता है नहीं किया जाएगा।"
दूसरे शब्दों में, इसे किसी कार्य के बीच में लिखना
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, के बाद से DisplayWebsiteLength()कोई लेना देना नहीं है xया y, कारण होगा DisplayWebsiteLength()"पृष्ठभूमि में" निष्पादित किया जाना है, की तरह
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
जाहिर है कि यह एक मूर्खतापूर्ण उदाहरण है, लेकिन क्या मैं सही हूं या मैं पूरी तरह से भ्रमित हूं या क्या?
(इसके अलावा, मैं क्यों के बारे में उलझन में हूँ senderऔर eकभी ऊपर समारोह के मुख्य भाग में उपयोग नहीं किया जाता।)
senderऔर eयह सुझाव दे रहे हैं कि यह वास्तव में एक इवेंट हैंडलर है - बहुत ही एकमात्र जगह जहां async voidवांछनीय है। सबसे अधिक संभावना है, यह एक बटन क्लिक या कुछ इस तरह से कहा जाता है - इसका परिणाम यह है कि यह कार्रवाई बाकी एप्लिकेशन के संबंध में पूरी तरह से अतुल्यकालिक रूप से होती है। लेकिन यह अभी भी सभी एक धागे पर है - यूआई थ्रेड (IOCP थ्रेड पर समय के एक छोटे से ज़ुल्फ़ के साथ जो UI थ्रेड को कॉलबैक पोस्ट करता है)।
DisplayWebsiteLengthकोड नमूने पर एक बहुत ही महत्वपूर्ण नोट : आपको HttpClientएक usingबयान में उपयोग नहीं करना चाहिए - एक भारी लोड के तहत, कोड सॉकेट की संख्या को समाप्त कर सकता है जिसके परिणामस्वरूप सॉकेटएक्सपेप्शन त्रुटियां हैं। अनुचित इंस्टेंटेशन पर अधिक जानकारी ।