इससे पहले मैंने क्लाइंट या सेवा पर Async-Await लागू करने से संबंधित this प्रश्न पोस्ट किया है। इस प्रश्न के साथ आगे बढ़ने से पहले प्रश्न पढ़ें क्योंकि यह कड़ाई से सवाल के साथ मिलकर है।Async-Await के वास्तविक फायदे?
उत्तर के आधार पर मैंने सी # 4.0 (टीपीएल) और सी # 5.0 (Async - Await) के लिए कोड का परीक्षण किया है। मैं सेवा द्वारा प्रदान की गई विधि के एसिंक और सिंक संस्करण का उपयोग करके सेवा को कॉल कर रहा हूं और प्रत्येक मामले में उपयोग किए गए थ्रेड की संख्या की तुलना कर रहा हूं। के बाद कोड मैं परीक्षण करने के लिए संसाधनों का इस्तेमाल किया उपयोग कर रहा हूँ है:
मुख्य विधि
List<Task<string>> tasksList = new List<Task<string>>();
List<int> asyncThreads = new List<int>();
List<int> tplThreads = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
// Call the Async version of the method
for (int i = 0; i < 500; i++)
{
tasksList.Add(GetNameFromServiceAsync("Input" + i.ToString(), asyncThreads));
}
Task.WaitAll(tasksList.ToArray());
watch.Stop();
foreach (var item in asyncThreads.Distinct())
{
Console.WriteLine(item);
}
Console.WriteLine("(C# 5.0)Asynchrony Total Threads = " + asyncThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
watch.Restart();
tasksList.Clear();
// Call the normal method
for (int i = 0; i < 500; i++)
{
tasksList.Add(GetNameFromService("Input" + i.ToString(), tplThreads));
}
Task.WaitAll(tasksList.ToArray());
watch.Stop();
foreach (var item in tplThreads.Distinct())
{
Console.WriteLine(item);
}
Console.WriteLine("(C# 4.0)TPL Total Threads" + tplThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Async और समन्वयन सेवा के लिए कॉल
static async Task<string> GetNameFromServiceAsync(string name, List<int> threads)
{
Console.WriteLine(" Start Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
var task = await client.GetNameAsync(name);
threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId);
// Console.WriteLine("End GetNameFromServiceAsync Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return task;
}
static Task<string> GetNameFromService(string name, List<int> threads)
{
var task = Task<string>.Factory.StartNew(() =>
{
threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId);
// Console.WriteLine("GetNameFromService Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return client.GetName(name);
});
return task;
}
अब मैं है उत्तर पर काम किया और निम्नलिखित परिणाम प्राप्त करें:
- यदि मैं सेवा में 500 कॉल करता हूं तो यह केवल 4-5 धागे का उपयोग करता है।
- टीपीएल कॉल लगभग 44-45 धागे बनाता है।
- Async कॉल के लिए समय लगभग 17 - 18 सेकंड
- टीपीएल कॉल के लिए समय लगभग 42 - 45 सेकंड है।
मैं अपने निष्कर्षों पर कुछ प्रतिक्रिया देना चाहता हूं ताकि यह अन्य समुदाय के सदस्यों के लिए भी उपयोगी हो सके। क्या यह मेरे पहले के सवाल का जवाब है ??
संपादित
मेरे अवलोकन प्र निष्कर्ष निकाला है कि अगर हम Async-का इंतजार करने के बजाय TPL के Task.Factory.startNew उपयोग करते हैं, तो यह कम धागे की खपत होगी। यह कैसे सही है? यदि नहीं, तो इस तरह की तुलना के साथ सही दिशा क्या है?
प्रश्न: जैसा कि मैं async सीख रहा हूं - प्रतीक्षा करें, मैं कुछ प्रकार की तुलना और ठोस कोड द्वारा अपना मूल्य साबित करना चाहता हूं।
आपका प्रश्न वास्तव में क्या है? –
async का उपयोग करके - प्रतीक्षा करें हम मेमोरी फायदे प्राप्त कर सकते हैं (कम संसाधनों का उपयोग किया जाएगा)। यही वह है जो मुझे अपने पहले के प्रश्न से मिला था या जो मैं समझ गया था और मैं जानना चाहता हूं कि इसका उत्तर है। मैं async-await का उपयोग कर स्केलेबिलिटी फायदे के संदर्भ में पूछना चाहता हूं। क्या मैंने यह निष्कर्ष निकाला है कि मैंने क्या निष्कर्ष निकाला है? –
एक महत्वपूर्ण लाभ और यह स्पष्ट है कि उपयोगकर्ता यह नहीं कह सकते कि उन्हें सिंक्रोनस कोड होने पर एसिंक्रोनस समस्या का सामना करना पड़ा। –