سؤال

لذلك أحاول قفل ملف تخزين معزول في تطبيق العميل C# الخاص بي ، بحيث لا تستطيع نسخ متعددة من طلبي الوصول إليه في نفس الوقت. أنا أستخدم بناء الجملة التالي:

lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Lock(0, 0);

يؤدي هذا الرمز إلى إلقاء طلبي من NullReferenceException من داخل طريقة Filestream.lock للإطار. لقد حاولت استخدام قيمة غير صفرية للطول. لقد حاولت كتابة بايت إلى الملف ثم قفل هذا البايت. بغض النظر عن ما أفعله ، فإن نفس NullreferenceException يستمر في ابتلاعني. هل يعرف أي شخص ما إذا كان هذا ممكنًا مع التخزين المعزول؟

كما أنني أبحث في استخدام هذه التقنية في تطبيق Silverlight أيضًا ، هل قفل ملف دعم Silverlight؟ يبدو أن مستندات MSDN تشير إلى أنه لا ، لكنني رأيت هذا المشنور من C# MVP الذي يقول إنه يفعل.

تحديث: قامت Microsoft بإصلاح الخطأ الذي قدمته على Connect ، لكن لم يتم إصداره في الإصدار 4 من الإطار. يجب أن يكون متاحًا على أمل في SP التالي أو الإصدار الكامل.

هل كانت مفيدة؟

المحلول

هذا يبدو وكأنه خطأ في الإطار. قد أكون مخطئًا ، لأنه حقًا أكبر من أن يكون صحيحًا.

بالنظر إلى الكود المصدري لـ .NET 3.5 SP1 مع Reflector ، يجد المرء أن ClosedStorageFilestream يستدعي مُنشئ القاعدة غير المعلمة (FileStream ()) ، مما يؤدي إلى فئة قاعدة غير محددة. تقوم ClosedStorageFilestream بإنشاء مثيل لـ Filestream ويستخدمه في جميع الطرق التي يتجاوزها (الكتابة ، القراءة ، التدفق ، البحث ، إلخ). من الغريب أنه لا يستفيد من فئة القاعدة مباشرة.

لكن Lock و Unlock لا يتم تجاوزهم ويحتاجون إلى حقل خاص (_Handle) الذي لا يزال فارغًا (لأن المنشئ المستخدم هو الحقل بدون المعلمة). إنهم يفترضون أنه غير خبيث ويتسبب في التسبب في NRE.

لتلخيص ، لا يتم دعم القفل وفتح (أو عربات التي تجرها الدواب).

أعتقد أنك مجبر على استخدام طرق القفل الأخرى مثل Mutex أو Semaphore.

التنفيذ هو نفسه في .NET 4 RC. في Silverlight ، لا توجد فتحة إلغاء قفل على الإطلاق (اعتذاري عن تناقض MVP).

نصائح أخرى

حاول امتلاك قيمة أكبر من 0 للحصول على كمية البيانات التي يجب قفلها. أيضًا ، هل هناك أي بيانات في الدفق ، إذا لم يكن هناك شيء قد يكون هو المشكلة ....

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top