c# मुझे अपनी आशाओं का इंतजार कब करना चाहिए?




.net async-await (2)

वर्तमान में हम अपनी परियोजना के खंडों को अपकेंद्रित करने के लिए अप-डाउन कर रहे हैं, याय!

हमारी अलग समझ के कारण, मैं और एक सहयोगी (उसे जिम कहते हैं), इस बारे में अलग-अलग राय है कि हमारा एसिंक्स / वेट कोड कैसे निष्पादित होगा और इसे लिखने का कौन सा तरीका है।

यहाँ उदाहरण विधि जिम ने लिखा है:

public async Task<HouseModel> GetHouseModel(Guid houseId)
{
    House house = await _houseService.GetHouse(houseId);

    Task<IEnumerable<Furniture>> furniture = _furnitureService.GetFurnitureForHouse(house);

    Task<IEnumerable<Appliances>> appliances = _applianceService.GetAppliancesForHouse(house);

    return _houseModelFactory.MakeHouseModel(await furniture, await appliances);
}

और इसका उदाहरण मैं इसे कैसे लिखूंगा:

public async Task<HouseModel> GetHouseModel(Guid houseId)
{
    House house = await _houseService.GetHouse(houseId);

    IEnumerable<Furniture> furniture = await _furnitureService.GetFurnitureForHouse(house);

    IEnumerable<Appliances> appliances = await _applianceService.GetAppliancesForHouse(house);

    return _houseModelFactory.MakeHouseModel(furniture, appliances);
}

मेरी समझ यह है: क्योंकि उपरोक्त furniture और appliance सेवाओं दोनों में विधियों को House आवश्यकता होती है, वे House की प्रतीक्षा जारी रखने से पहले उपलब्ध होंगे। फिर, House आवश्यकता वाले दोनों तरीके चलेंगे, लेकिन दूसरा तरीका ( GetAppliancesForHouse ) शुरू होने से पहले पहले खत्म होने का इंतजार नहीं करेगा।

जिम की समझ यह है कि हमें दोनों तरीकों का इंतजार तभी करना चाहिए जब उनकी जरूरत हो। ताकि वे दोनों एक दूसरे के समानांतर चलेंगे। वह सोचता है कि ऐसा करने से मेरा दूसरा तरीका पहले का इंतजार करने का परिणाम होगा, अर्थात्: GetAppliancesForHouse GetFurnitureForHouse प्रतीक्षा में।

क्या इनमें से कोई भी समझ सही है? या हम बस इसे बना रहे हैं जैसे हम साथ चलते हैं? हमें कब इंतजार करना चाहिए?


आप में से कोई भी सही नहीं है, कारणों के लिए Erndob द्वारा उत्तर देखें। हालाँकि, किसी एक प्रश्न का उत्तर नहीं दिया गया है:

हमें कब इंतजार करना चाहिए?

  • क्या आप चाहते हैं कि काम क्रमिक रूप से हो? अपने तरीके का उपयोग करें।
  • क्या आप चाहते हैं कि काम समानांतर रूप से हो? जिम के तरीके का उपयोग करें।

नोट : जिम का तरीका वास्तव में समानांतर में नहीं चलेगा यदि टास्क शेड्यूलर का उपयोग किया जाता है, दोनों टास्क को एक ही समय में चलाने में असमर्थ है, उदाहरण के लिए, सिस्टम संसाधनों की कमी के कारण (धन्यवाद @AdamSimon )।


मेरी समझ यह है: क्योंकि उपरोक्त फर्नीचर और उपकरण सेवाओं दोनों में विधियों को हाउस की आवश्यकता होती है, वे सदन की प्रतीक्षा जारी रखने से पहले उपलब्ध होंगे।

आपकी समझ गलत है। जिन विधियों के लिए सदन की आवश्यकता होती है, वे सदन की प्रतीक्षा में नहीं हैं क्योंकि आपको इसकी आवश्यकता है। वे अपनी निर्भरता को हल नहीं करते हैं और कोड का इंतजार करना चाहिए या अपने दम पर नहीं। कोड मकान पाने के लिए इंतजार करता है क्योंकि आपने इससे पहले await किया है । आगे क्या होने वाला है, इसकी जानकारी नहीं है।

फिर, हाउस की आवश्यकता वाले दोनों तरीके चलेंगे, लेकिन दूसरा तरीका (GetAppliancesForHouse) शुरू होने से पहले पहले खत्म होने का इंतजार नहीं करेगा।

इसी तरह, GetAppliancesForHouse की अपनी समझ नहीं होगी अगर उसे प्रतीक्षा करनी चाहिए या निर्भरता के आधार पर नहीं। GetAppliancesForHouse नहीं चलेगा, क्योंकि आपका कोड पहले GetFurnitureForHouse का इंतजार करने के लिए कहता है। आपका कोड हमेशा क्रमिक रूप से चलेगा

जिम की समझ यह है कि हमें दोनों तरीकों का इंतजार तभी करना चाहिए जब उनकी जरूरत हो। ताकि वे दोनों एक दूसरे के समानांतर चलेंगे।

यह आम तौर पर सच है। जैसा कि अन्य ने बताया है, कोड अभी भी अन्य कारकों के आधार पर समानांतर में नहीं चल सकता है। इसके अलावा, समानांतर में कोड नहीं चलाने के लिए वैध कारण हो सकते हैं।

वह सोचता है कि ऐसा करने से मेरा दूसरा तरीका पहले का इंतजार करने का परिणाम होगा, अर्थात्: GetAppliancesForHouse GetFfishForHouse की प्रतीक्षा में।

वह सही है।

यह देखने के लिए कि वास्तव में क्या होता है, आप ब्रेकपॉइंट लगा सकते हैं और देख सकते हैं कि प्रत्येक पंक्ति के बाद क्या होता है। जिम्स मामले में, फर्नीचर से उपकरण तक जाने के बाद, फर्नीचर चर का मूल्य अभी तक नहीं होगा, यह अभी भी एक काम है, लेकिन आप पहले से ही अगली पंक्ति में हैं।

अपने मामले के साथ, उपकरण लाइन पर जाकर, आप देखेंगे कि फर्नीचर का पहले से ही मूल्य है, क्योंकि वह इसके लिए इंतजार कर रहा था।





async-await