2013-07-23 10 views
10

पर कॉल की सीमा # मैं सी ++ दुनिया से आया हूं इसलिए मुझे धागे और म्यूटेक्स गार्डिंग को लॉक करने के लिए बहुत उपयोग किया जाता है।सी # async/प्रतीक्षा - एसिंक विधियों/लॉकिंग

async Task BasicProcess() { 
    // await time consuming task 
} 

मैं इस समारोह कैसे ताला तो केवल एक ही BasicProcess एक समय में चला सकते हैं कर सकते हैं: इस मूल कार्य मान लिया जाये?

async Task BasicProcess() { 
    lock (BasicProcessLock) { 
     // await time consuming task 
    } 
} 
+5

देखें http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988 AsyncLock कार्यान्वयन के लिए .aspx। –

उत्तर

29

किसी अन्य धागे आप SemaphoreSlim उपयोग कर सकते हैं ताला प्राप्त कर सकते हैं (1) इस के लिए, के साथ बनाया एक SemaphoreSlim (1) यकीन है कि केवल एक ही धागा कर देगा:

यह मैं क्या हासिल करना चाहते है जो लॉक पाने का प्रयास करता है - उसे प्राप्त करने तक प्रतीक्षा करेगा - इसे छोड़ दें।
एक निजी सदस्य बनाने के लिए:

private SemaphoreSlim _syncLock = new SemaphoreSlim(1); 

फिर अपने कोड में कार्य करें:

async Task BasicProcess() { 

    await _syncLock.WaitAsync(); //Only 1 thread can access the function or functions that use this lock, others trying to access - will wait until the first one released. 
    //Do your stuff.. 
    _syncLock.Release(); 

} 
+2

सिवाय इसके कि यह अब कॉलिंग थ्रेड को अवरुद्ध कर देगा, जो आदर्श नहीं है, अगर यह वास्तव में असीमित होना है। –

+0

बेहतर उपयोग "await _syncLock.WaitAsync();" - अन्यथा, धागा अवरुद्ध हो जाएगा और कार्य नहीं चलेगा। – jlahd

+0

जॉन/jlahd - इसके लिए धन्यवाद, ब्लॉक करने के क्रम में अद्यतन किया गया। – ilansch