में एक गैर एसिंक-विधि (जो वेब कॉल करता है) को लपेटना मुझे पता है कि आपको केवल उन चीजों के लिए एसिंक का उपयोग करना चाहिए जो "सीपीयू-गहन" नहीं है, उदाहरण के लिए फाइल लिखती है, वेब कॉल इत्यादि। इसलिए मुझे यह भी पता है कि प्रत्येक विधि को Task.Run
या कुछ समान में लपेटने का अर्थ नहीं है।एसिंक
हालांकि मुझे पता होना चाहिए कि जब कोई तरीका एक वेब कॉल करता है, लेकिन यह एसिंक इंटरफ़ेस प्रदान नहीं करता है। क्या यह इस मामले में लपेटने लायक है?
कंक्रीट उदाहरण:
मैं अपने WebAPI आवेदन (सर्वर) में CSOM (क्लाइंट SharePoint ऑब्जेक्ट मॉडल) का उपयोग कर रहा है और एक SharePoint सूची प्राप्त करना चाहते हैं।
यह सामान्य रूप से इस तरह से किया जाता है:
[HttpGet]
[Route("foo/{webUrl}")]
public int GetNumberOfLists(string webUrl)
{
using (ClientContext context = new ClientContext(webUrl))
{
Web web = context.Web;
context.Load(web.Lists);
context.ExecuteQuery();
return web.Lists.Count;
}
}
और मैं कुछ इस तरह करने के लिए इसे बदलने के बारे में सोचा:
[HttpGet]
[Route("foo/{webUrl}")]
public async Task<int> GetNumberOfLists(string webUrl)
{
using (ClientContext context = new ClientContext(webUrl))
{
Web web = context.Web;
context.Load(web.Lists);
await Task.Run(() => clientContext.ExecuteQuery());
return web.Lists.Count;
}
}
यह मतलब है और यह मदद करता है? जैसा कि मैं इसे समझता हूं, मैं सिर्फ क्वेरी ("ओवरहेड") निष्पादित करने के लिए एक नया धागा बना/चाहता हूं लेकिन कम से कम अनुरोध थ्रेड किसी अन्य अनुरोध के लिए स्वतंत्र/तैयार होगा (यह अच्छा होगा)।
लेकिन क्या यह इसके लायक है और इसे ऐसा किया जाना चाहिए?
यदि ऐसा है: क्या यह अजीब बात नहीं है कि माइक्रोसॉफ्ट बॉक्स के बाहर "async" विधि प्रदान नहीं करता है या क्या उन्हें इसकी परवाह नहीं है?
संपादित करें: टिप्पणी में सुझाए गए अनुसार Task.Run
का उपयोग करने के लिए अपडेट किया गया।
'टास्क.फैक्टरी.स्टार्टन्यू 'का उपयोग न करें,' टास्क.रुन 'का उपयोग करें। * SharePoint * को कॉल करने के लिए, संदर्भ में 'ExecuteQueryAsync' विधि है जिसे एक कार्य –
वापस करने के लिए अनुकूलित किया जा सकता है मेरे पास मेरे CSOM लाइब्रेरी में' ExecuteQueryAsync' नहीं है जिसका उपयोग मैं कर रहा हूं .... दूसरी चीज़ जो मैंने बदल दी। –
बस माइक्रोसॉफ्ट के माध्यम से 'माइक्रोसॉफ्ट.शेयरपॉइंटऑनलाइन.CSOM, 16.1.6216' तक पहुंचा - अभी भी' ExecuteQueryAsync' नहीं है। –