c# - थ्रॉटल एसिंक कार्य?



.net asynchronous (1)

आप ज्यादातर मामलों में कुछ करने के लिए खुद को सीमित करना चाहते हैं आपके पास हमेशा कुछ राज्य रखा जाता है जब आपके पास कई ऑपरेशन चल रहे हैं यदि वे सीपीयू हैं तो कार्य ThreadPool कतार में एक थ्रेड के लिए इंतजार कर रहे हैं और अगर यह एसिंक है तो आपके पास हीप पर बैठे राज्य मशीन है।

यहां तक ​​कि एएसआईएनसी ऑपरेशंस आमतौर पर कुछ सीमित संसाधनों का इस्तेमाल करते हैं, यह बैंडविड्थ, बंदरगाहों, रिमोट डीबी सर्वर के सीपीयू आदि में हो।

आपको एक समय में एक बैच में खुद को सीमित करने की ज़रूरत नहीं है (जैसा कि आप को दूसरे ऑपरेशन के बजाय अंतिम ऑपरेशन के लिए प्रतीक्षा करने की आवश्यकता है)। आप SlimSemahpore या बेहतर, एक टीपीएल डाटाफ्लो ब्लॉक का इस्तेमाल कर सकते हैं:

var block = new ActionBlock<string>(
   url => downloadAsync(url),
   new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 });    

urlList.ForEach(url => block.Post(url));

block.Complete();
await block.Completion;

मैं जानना चाहूंगा कि यदि हमें एशिनक कार्यों को दबाना चाहिए तो अगर कार्यों को पूरा करने की संख्या बड़ा है कहें कि आपके पास 1000 यूआरएल हैं, क्या आप सभी अनुरोधों को एक साथ आग लगाते हैं और सभी के लिए इंतजार करते हैं:

var tasks = urlList.Select(url => downloadAsync(url));
await Task.WhenAll(tasks);

या आप अनुरोध बैच करते हैं और एक बैच को दूसरे के बाद प्रोसेस करते हैं:

foreach (var urlBatch in urlList.BatchEnumerable(BatchSize)){
    var tasks = urlBatch.Select(url => downloadAsync(url));
    await Task.WhenAll(tasks);
}

मैंने सोचा था कि बैचिंग आवश्यक नहीं है, क्योंकि पहले दृष्टिकोण (एक बार सभी अनुरोधों को फायरिंग) ThreadPool द्वारा निर्धारित कार्यों को बनाएगा, इसलिए हमें ThreadPool को प्रत्येक कार्य को निष्पादित करने का निर्णय देना चाहिए। हालांकि, मुझे बताया गया था कि अभ्यास में कार्य केवल कार्य करता है अगर कार्य गणना कार्य है जब कार्य नेटवर्क अनुरोधों को शामिल करता है, तो पहला तरीका मेजबान मशीन को लटका सकता है ??? ऐसा क्यों है ?





throttling