এটি http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx , http://winrtstoragehelper.codeplex.com/ , উইন্ডোজ 8 অ্যাপ স্টোর এবং নেট নেট 4.5 রেফারেন্স করে
এখানে আমার কোণ এখানে:
অ্যাসিঙ্ক / অপেক্ষারত ভাষার বৈশিষ্ট্যটি অনেকগুলি বিষয়কে মোটামুটি সহজ করে তোলে তবে এটি এমন একটি দৃশ্যেরও পরিচয় দেয় যা অ্যাসিঙ্ক কলগুলি ব্যবহার করা এত সহজ হওয়ার আগে খুব কমই ঘটেছিল: পুনরায় প্রবেশ করা।
এটি ইভেন্ট হ্যান্ডলারদের জন্য বিশেষত সত্য, কারণ ইভেন্ট হ্যান্ডলার থেকে ফিরে আসার পরে অনেক ইভেন্টের জন্য কী ঘটছে সে সম্পর্কে আপনার কোনও ধারণা নেই। আসলে যা ঘটতে পারে তা হ'ল, প্রথম ইভেন্ট হ্যান্ডলারে আপনি যে অ্যাসিঙ্ক পদ্ধতিটির অপেক্ষায় রয়েছেন, সেই একই থ্রেডে এখনও অন্য ইভেন্ট হ্যান্ডলারের কাছ থেকে ডেকে আনা হবে।
এখানে একটি উইন্ডোজ 8 অ্যাপ স্টোর অ্যাপ্লিকেশনটিতে আমি আসলাম এমন একটি বাস্তব দৃশ্য: আমার অ্যাপ্লিকেশনটির দুটি ফ্রেম রয়েছে: একটি ফ্রেম থেকে আসা এবং ছেড়ে যাওয়া আমি ফাইল / স্টোরেজে কিছু ডেটা লোড / নিরাপদ করতে চাই। OnNavigatedTo / from ইভেন্টগুলি সঞ্চয় এবং লোডিংয়ের জন্য ব্যবহৃত হয়। সঞ্চয় ও লোডিং কিছু অ্যাসিঙ্ক ইউটিলিটি ফাংশন (যেমন: http://winrtstoragehelper.codeplex.com/ ) দ্বারা সম্পন্ন হয় । ফ্রেম 1 থেকে ফ্রেম 2 এ বা অন্য দিকে নেভিগেট করার সময়, অ্যাসিঙ্ক লোড এবং নিরাপদ ক্রিয়াকলাপগুলি ডাকা এবং প্রতীক্ষিত। ইভেন্ট হ্যান্ডলারগুলি অ্যাসিঙ্ক ফিরতে শূন্য হয়ে যায় => তারা অপেক্ষা করতে পারে না।
তবে ইউটিলিটির প্রথম ফাইল ওপেন অপারেশন (বলুন: একটি সেভ ফাংশনটির অভ্যন্তরে) ইউসুটিটিও অ্যাসিঙ্ক হয় এবং তাই প্রথম ফ্রেমওয়ার্কটিতে নিয়ন্ত্রণের প্রত্যাবর্তন হয়, যা পরে কিছুটা দ্বিতীয় ইভেন্ট হ্যান্ডলারের মাধ্যমে অন্যান্য ইউটিলিটি (লোড) ডাকে। লোড এখন একই ফাইলটি খোলার চেষ্টা করে এবং সেভ অপারেশনের জন্য যদি ফাইলটি যদি এখনই খোলা থাকে তবে একটি অ্যাকসেসডেনআইড ব্যতিক্রম ব্যর্থ হয়।
আমার জন্য একটি সর্বনিম্ন সমাধান হ'ল ব্যবহার এবং একটি এসিঙ্কলকের মাধ্যমে ফাইল অ্যাক্সেস সুরক্ষিত করা।
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 অ্যাপ স্টোর অ্যাপ এবং আমার সংশোধিত সংস্করণ যা স্টিফেন টব http: //blogs.msdn থেকে অ্যাসিঙ্কলক ব্যবহার করে । com / b / pfxteam / সংরক্ষণাগার / 2012/02/12 / 10266988.aspx ।
আমি এই লিঙ্কটিও সুপারিশ করতে পারি:
http://www.hanselman.com/blog/ComperingTwoTechnificationsInNETAsynchronousCoordinationPrimitives.aspx