मेरे पास ASP.NET एप्लिकेशन में एक विधि है, जिसे पूरा करने में काफी समय लगता है। कैश की स्थिति और उपयोगकर्ता द्वारा प्रदान किए जाने वाले मापदंडों के आधार पर, इस पद्धति का कॉल एक उपयोगकर्ता के अनुरोध के दौरान 3 बार तक हो सकता है। प्रत्येक कॉल को पूरा होने में लगभग 1-2 सेकंड लगते हैं। विधि स्वयं सेवा के लिए तुल्यकालिक कॉल है और कार्यान्वयन को ओवरराइड करने की कोई संभावना नहीं है।
तो सेवा के लिए तुल्यकालिक कॉल कुछ इस तरह दिखता है:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
और विधि का उपयोग है (ध्यान दें, विधि की कॉल एक से अधिक बार हो सकती है):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
मैंने इस पद्धति का एक साथ काम प्रदान करने के लिए अपनी ओर से कार्यान्वयन को बदलने की कोशिश की, और यहां तक कि मैं अब तक आया हूं।
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
उपयोग (सेवा करने के लिए कॉल के साथ "अन्य सामान करें" कोड का हिस्सा):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
मेरा प्रश्न निम्नलिखित है। क्या मैं ASP.NET अनुप्रयोग में निष्पादन को गति देने के लिए सही दृष्टिकोण का उपयोग करता हूं या क्या मैं अनावश्यक रूप से सिंक्रोनस कोड चलाने की कोशिश कर रहा हूँ? क्या कोई समझा सकता है कि ASP.NET में दूसरा दृष्टिकोण एक विकल्प क्यों नहीं है (यदि यह वास्तव में नहीं है)? इसके अलावा, अगर ऐसा तरीका लागू होता है, तो क्या मुझे इस तरह की विधि को अतुल्य रूप से कॉल करने की आवश्यकता है यदि यह एकमात्र कॉल है जो हम इस समय कर सकते हैं (मेरे पास ऐसा मामला है, जब कोई अन्य सामान पूरा होने के इंतजार के दौरान क्या करना है)?
इस विषय पर नेट के अधिकांश लेख async-await
कोड के साथ दृष्टिकोण का उपयोग करते हुए कवर करते हैं , जो पहले से ही awaitable
तरीके प्रदान करता है, लेकिन यह मेरा मामला नहीं है। यहाँमेरे मामले का वर्णन करने वाला अच्छा लेख है, जो समानांतर कॉल की स्थिति का वर्णन नहीं करता है, सिंक कॉल को लपेटने के विकल्प को कम करता है, लेकिन मेरी राय में मेरी स्थिति बिल्कुल ऐसा करने का अवसर है।
मदद और सुझावों के लिए अग्रिम धन्यवाद।
Task.Run
, तो सामग्री दूसरे धागे में चली गई, जो कि थ्रेड पूल से ली गई है। तब अवरुद्ध कॉल (जैसे मेरा कॉल टू सर्विस) कोRun
एस में लपेटने की कोई आवश्यकता नहीं है , क्योंकि वे हमेशा एक-एक धागे का उपभोग करेंगे, जो विधि के निष्पादन के दौरान अवरुद्ध हो जाएगा। ऐसी स्थिति में एकमात्र लाभ जोasync-await
मेरे मामले से बचा हुआ है, एक समय में कई क्रियाएं कर रहा है। मुझे सही जवाब दो अगर मैं गलत हूँ।