C# में समवर्तीता और मल्टीथ्रेडिंग: उन्नत स्तर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# में समवर्तीता और मल्टीथ्रेडिंग: उन्नत स्तर



C# में आधुनिक विकास में, समवर्तीता और मल्टीथ्रेडिंग केवल क्षमताओं का विस्तार नहीं हैं, बल्कि तेज़, उत्तरदायी और स्केलेबल एप्लिकेशन बनाने के लिए मौलिक उपकरण हैं। उन्नत स्तर पर, हम Task.Run चलाने से आगे बढ़ते हैं और शेड्यूलर की बारीकियों, संदर्भों के सिंक्रनाइज़ेशन और साझा डेटा के साथ काम करने के पैटर्न का सामना करते हैं। इस लेख में, हम C# (.NET) में समवर्तीता की प्रमुख उन्नत अवधारणाओं पर चर्चा करेंगे जो आपको कुशल और सुरक्षित कोड लिखने में मदद करेंगी।



1. Task और ValueTask: गहन उपयोग



क्लास Task C# में एसिंक्रोनस प्रोग्रामिंग का आधार है। हालांकि, उन्नत स्तर पर Task और ValueTask के बीच अंतर को समझना, साथ ही कार्यों के जीवनचक्र का प्रबंधन करना महत्वपूर्ण है।



ValueTask का उपयोग कब करें?

ValueTask एक संरचना है जो Task ऑब्जेक्ट के लिए मेमोरी आवंटन से बचने की अनुमति देती है जब परिणाम पहले से ही सिंक्रोनस रूप से उपलब्ध हो। यह उच्च-प्रदर्शन परिदृश्यों के लिए महत्वपूर्ण है, उदाहरण के लिए, कैशिंग विधियों में।



public class CacheService{    private readonly Dictionary<string, string> _cache = new();

public async ValueTask<string> GetDataAsync(string key) { if (_cache.TryGetValue(key, out string value)) { // परिणाम पहले से मौजूद है, Task नहीं बनाते return value; }

// एसिंक्रोनस डेटा प्राप्ति string data = await FetchFromDatabaseAsync(key); _cache[key] = data; return data; }

private async Task<string> FetchFromDatabaseAsync(string key) { await Task.Delay(100); // विलंब का अनुकरण return $"Data for {key}"; }}


उन्नत त्रुटि प्रबंधन और रद्दीकरण

लंबी अवधि के संचालन को सही ढंग से रद्द करने के लिए CancellationToken का उपयोग करें। CancellationTokenSource.CreateLinkedTokenSource के माध्यम से कई टोकन को संयोजित करें।



public async Task ProcessWithTimeoutAsync(CancellationToken externalToken){    using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5));    using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(externalToken, timeoutCts.Token);

try { await LongRunningOperationAsync(linkedCts.Token); } catch (OperationCanceledException) { Console.WriteLine("संचालन रद्द किया गया या समय समाप्त हुआ।"); }}


2. SynchronizationContext और कार्य शेड्यूलर



UI थ्रेड्स (WPF, WinForms) और ASP.NET Core के साथ काम करने के लिए SynchronizationContext को समझना आवश्यक है। उन्नत स्तर पर, आप अपने स्वयं के सिंक्रनाइज़ेशन संदर्भ बना सकते हैं।



थ्रेड पूल के लिए संदर्भ सेट करना

डिफ़ॉल्ट रूप से, await वर्तमान SynchronizationContext को कैप्चर करता है। इससे बचने (और डेडलॉक को रोकने) के लिए, ConfigureAwait(false) का उपयोग करें।



public async Task ProcessDataAsync(){    // यह कोड मूल संदर्भ में निष्पादित होता है (जैसे, UI)    await Task.Run(() => HeavyComputation()).ConfigureAwait(false);

// ConfigureAwait(false) के बाद — थ्रेड पूल के संदर्भ में // UI तत्वों तक कोई पहुंच नहीं! Console.WriteLine("थ्रेड पूल में निष्पादित");}


कस्टम शेड्यूलर बनाना

आप अपना स्वयं का TaskScheduler लागू कर सकते हैं, उदाहरण के लिए, एक साथ निष्पादित कार्यों की संख्या को सीमित करने के लिए (शेड्यूलर स्तर पर SemaphoreSlim का एनालॉग)।



public class LimitedConcurrencyTaskScheduler : TaskScheduler{    private readonly SemaphoreSlim _semaphore;    private int _runningTasks;

public LimitedConcurrencyTaskScheduler(int maxConcurrency) { _semaphore = new SemaphoreSlim(maxConcurrency);

ब्लॉग

पुस्तक अनुशंसाएँ