यह http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx , http://winrtstoragehelper.codeplex.com/ , विंडोज 8 ऐप स्टोर और .net 4.5 का उल्लेख करता है।
यहाँ इस पर मेरा कोण है:
Async / प्रतीक्षित भाषा फीचर कई चीजों को काफी आसान बना देता है, लेकिन यह एक ऐसे परिदृश्य का भी परिचय देता है, जो शायद ही कभी मुठभेड़ में था, इससे पहले कि यह async कॉल का उपयोग करना इतना आसान था: reentrance।
यह विशेष रूप से ईवेंट हैंडलर के लिए सही है, क्योंकि कई ईवेंट के लिए आपके पास इवेंट हैंडलर से लौटने के बाद क्या हो रहा है, इसके बारे में कोई सुराग नहीं है। एक चीज जो वास्तव में हो सकती है, वह यह है कि पहले ईवेंट हैंडलर में जिस एसिक्स विधि का आप इंतजार कर रहे हैं, वह दूसरे ईवेंट हैंडलर से अभी भी उसी थ्रेड पर कॉल की जाती है।
यहाँ एक वास्तविक परिदृश्य है जो मैंने विंडोज 8 ऐप स्टोर ऐप में देखा है: मेरे ऐप के दो फ्रेम हैं: फ्रेम में आने और छोड़ने से मैं फ़ाइल / स्टोरेज के लिए कुछ डेटा लोड / सुरक्षित करना चाहता हूं। OnNavigatedTo / से घटनाओं को बचाने और लोड करने के लिए उपयोग किया जाता है। बचत और लोडिंग कुछ async यूटिलिटी फंक्शन (जैसे http://winrtstoragehelper.codeplex.com/ ) द्वारा की जाती है। फ्रेम 1 से फ्रेम 2 या अन्य दिशा में नेविगेट करते समय, एसिंक्स लोड और सुरक्षित संचालन कहा जाता है और प्रतीक्षित होता है। घटना संचालकों async लौटने शून्य हो जाते हैं => वे इंतजार नहीं किया जा सकता है।
हालाँकि, उपयोगिता का पहला फ़ाइल ओपन ऑपरेशन (बताता है: एक सेव फंक्शन के अंदर) भी async है और इसलिए पहला प्रतीक्षित रिटर्न फ्रेमवर्क पर नियंत्रण रखता है, जिसे कुछ समय बाद दूसरे इवेंट हैंडलर के माध्यम से अन्य उपयोगिता (लोड) कहते हैं। लोड अब उसी फ़ाइल को खोलने का प्रयास करता है और यदि फ़ाइल सहेजने के लिए अब तक खुली है, तो ACCESSDENIED अपवाद के साथ विफल हो जाती है।
मेरे लिए एक न्यूनतम समाधान एक उपयोग और एक AsyncLock के माध्यम से फ़ाइल एक्सेस को सुरक्षित करना है।
private static readonly AsyncLock m_lock = new AsyncLock();
...
using (await m_lock.LockAsync())
{
file = await folder.GetFileAsync(fileName);
IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read);
using (Stream inStream = Task.Run(() => readStream.AsStreamForRead()).Result)
{
return (T)serializer.Deserialize(inStream);
}
}
कृपया ध्यान दें कि उसका लॉक मूल रूप से केवल एक लॉक के साथ उपयोगिता के लिए सभी फ़ाइल ऑपरेशन को लॉक करता है, जो अनावश्यक रूप से मजबूत है लेकिन मेरे परिदृश्य के लिए ठीक काम करता है।
यहाँ मेरा परीक्षण प्रोजेक्ट है: http://winrtstoragehelper.codeplex.com/ से मूल संस्करण के लिए कुछ परीक्षण कॉल के साथ एक विंडोज़ 8 ऐप स्टोर ऐप और मेरा संशोधित संस्करण जो स्टीफन टूब से AsyncLock का उपयोग करता है http: । com / b / pfxteam / संग्रह / 2012/02/12 / 10266988.aspx ।
क्या मैं भी इस लिंक का सुझाव दे सकता हूं:
http://www.hanselman.com/blog/ComparingTwoTechniquesInNETAsynchronousCoordinationPrimatics.aspx