मैं एक एपीआई विकसित कर रहा हूं, इस एपीआई में मेरे पास एक विधि के साथ एक सेवा है और इस विधि को विभिन्न भंडारों में तीन विधियों को कॉल करना है। इन विधियों में से प्रत्येक में एक Https अनुरोध है, कॉल का जवाब है और मैं इस प्रतिक्रिया से जानकारी प्राप्त करना चाहता हूं।

अब, हम इनमें से प्रत्येक कॉल की प्रतीक्षा कर रहे हैं और प्रदर्शन भयानक है।

मैं इन तीन कॉलों को एक ही समय में कैसे कर सकता हूं? मैं समानांतर का उपयोग करना जानता हूं लेकिन मुझे नहीं पता कि कैसे।

सेवा:

    public async Task<object> GetTenantSettings(string source, string tenantId)
    {
        var tenantSettings = await _repository1.GetTenant(tenantId);
        var accountCount = await _repository2.GetAccount(tenantId);
        var userCount = await _repository3.GetUsers(source, int.Parse(tenantId));

        var TenantSettingsModel = MapTenant(accountCount, userCount, tenantSettings); // To map, out of scope of the problem

        return TenantSettingsModel;
    }

भंडार का इंटरफ़ेस, मैं एक दिखाता हूं लेकिन सभी का एक ही विचार है।

    Task<int> GetAccount(string tenantId);

अब हम एक विधि को कॉल कर रहे हैं और दूसरे के बाद, मैं इसे एक ही समय में कैसे कॉल कर सकता हूं और जानकारी प्राप्त कर सकता हूं?

-1
CMorillo 19 जून 2019, 15:04

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि आप एक कोई भी अवरुद्ध नहीं async परिणाम चाहते हैं, वास्तविक समानांतर नहीं, उस स्थिति में यह एक Task.WhenAll जोड़ने जितना आसान है:

var tenantSettings = _repository1.GetTenant(tenantId);
var accountCount = _repository2.GetAccount(tenantId);
var userCount =  _repository3.GetUsers(source, int.Parse(tenantId));

await Task.WhenAll(tenantSettings, accountCount, userCount);

var TenantSettingsModel = MapTenant(accountCount.Result, userCount.Result, tenantSettings.Result);

वास्तविक समानांतर प्रसंस्करण के लिए Task.Run() का उपयोग करके नए धागे पैदा करने की आवश्यकता होगी। यह संभव है, लेकिन यह मानते हुए कि रिपॉजिटरी में आपकी कॉल्स IO बाउंड हैं , CPU बाध्य नहीं, आपको अधिक लाभ प्राप्त करने की संभावना नहीं है, जहां-इस दृष्टिकोण को थ्रेड को अवरुद्ध किए बिना आपके आईओ उपयोग को अधिकतम करना चाहिए।

याद रखें, "तेज़" उतना आसान नहीं है जितना लगता है। यदि यह एक बहु थ्रेडेड वातावरण है (उदाहरण के लिए एक वेब एप्लिकेशन) तो आप पॉल को भुगतान करने के लिए पीटर को लूट सकते हैं (विशेषकर जब नए धागे पैदा करते हैं)। वास्तविक पुष्टि करने का एकमात्र तरीका है कि अगर कुछ "तेज" है तो इसे लोड के तहत बेंचमार्क करना है।

3
Liam 19 जून 2019, 15:16