2013-06-08 7 views
5

मेरे पास एक विधि है जिसे अक्सर कई धागे से बुलाया जाता है। इसमें await FileIO.WriteTextAsync का उपयोग कर डिस्क पर लिखना शामिल है। यह ठीक काम करता है जब यह किसी एकल थ्रेड से कहा जाता है, लेकिन एक बार मैं एक से अधिक थ्रेड में यह कर शुरू, मैं इस त्रुटि मिलती है:मेट्रो ऐप FileIO.WriteTextAsync एकाधिक थ्रेड

The process cannot access the file because it is being used by another process. 

मुझे पता है कि त्रुटि का अर्थ है, लेकिन मैं कैसे काम करने के लिए यकीन नहीं है इसके आसपास। आम तौर पर, यह सुनिश्चित करने के लिए कि एक समय में केवल एक थ्रेड द्वारा फ़ाइल का उपयोग किया जा रहा है, मैं lock(object) कथन बनाउंगा। हालांकि, यह एक असीमित विधि है और इस तरह मैं lock(object) कथन के शरीर में await ऑपरेटर का उपयोग नहीं कर सकता।

कृपया इस परिदृश्य को संभालने के तरीके पर सलाह दें।

उत्तर

6

आप एक async संगत ताला के रूप में कार्य करने के लिए SemaphoreSlim उपयोग कर सकते हैं:

SemaphoreSlim _mutex = new SemaphoreSlim(1); 

async Task MyMethodAsync() 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    ... 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

व्यक्तिगत रूप से, मैं finally पसंद नहीं है, तो मैं आमतौर पर लिखना मेरे अपने IDisposable जब निपटारा म्युटेक्स जारी करने के लिए, और मेरे कोड इस तरह दिख सकता है:

async Task MyMethodAsync() 
{ 
    // LockAsync is an extension method returning my custom IDisposable 
    using (await _mutex.LockAsync()) 
    { 
    ... 
    } 
} 
+0

वेल स्टीफन यह कोई आश्चर्य की बात नहीं है कि आपके पास इतनी बड़ी प्रतिष्ठा क्यों है। समाधान और इसके लिए आपका व्यक्तिगत स्पर्श शानदार था। मेरी प्रक्रिया पूरी तरह से चल रही है। मैंने आपके लॉगिंग क्लास को गोम लगाने के लिए भी आपके सुझाव का उपयोग किया है जो एक समान समस्या से पीड़ित था। उसके लिए धन्यवाद! – c0D3l0g1c

+0

आपका स्वागत है! –

संबंधित मुद्दे