2010-03-04 16 views
4

所以我試圖鎖定我的C#客戶端應用程序中的一個孤立的存儲文件,以便我的應用程序的多個副本無法同時訪問它。我使用的語法如下:.NET隔離存儲文件鎖定拋出NRE

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

此代碼會導致我的應用從框架的FileStream.Lock方法內拋出一個NullReferenceException。我曾嘗試使用非零值的長度。我試圖寫一個字節的文件,然後鎖定該字節。不管我做什麼,同樣的NullReferenceException一直困擾着我。有沒有人知道這是可能的孤立存儲?

另外我正在研究在Silverlight應用程序中使用這種技術,Silverlight是否支持文件鎖定? MSDN文檔似乎表明它沒有,但我已經從C#MVP,說確實看到this post

更新:Microsoft修復了我在Connect上提交的錯誤,但它並未在框架的第4版中發佈。它應該可用於下一個SP或完整版本。

+0

我能夠通過使用反射來呼籲IsolatedStorageFileStream的私人「m_fs」字段Lock方法等,以解決此bug,因此: lockStream =新IsolatedStorageFileStream(「q.lck」,FileMode.OpenOrCreate,isoStore); FileStream m_fs = typeof(IsolatedStorageFileStream).InvokeMember((「m_fs」),BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance,null,lockStream,null)作爲FileStream; m_fs.Lock(0,long.MaxValue); – bsiegel 2010-03-05 15:57:55

回答

4

這看起來像一個框架中的錯誤。我可能是錯的,因爲它太大而不真實。

用Reflector查看.NET 3.5 SP1的源代碼,發現IsolatedStorageFileStream調用無參的基構造函數(FileStream()),這會導致未真正初始化的基類。 IsolatedStorageFileStream創建FileStream的實例,並使用它,因爲它覆蓋(寫,讀,同花順,求等)的所有方法。奇怪的是它沒有直接利用它的基類。

但鎖定和解鎖沒有被覆蓋,他們需要一個仍然爲空的私有字段(_handle)(因爲使用的構造函數是無參數的)。他們認爲它是非空的並將其解引用並導致NRE。

總而言之,鎖定和解鎖不被支持(或錯誤)。

我想你不得不使用其他鎖定方法,如互斥或信號量。

的實施是在.NET 4 RC相同。在Silverlight中,鎖定解鎖並不存在(我對與MVP相矛盾的道歉)。

+0

謝謝,我通過反射鏡看了一下,我很肯定你是正確的。我提交了關於連接的錯誤,請隨時投票:https://connect.microsoft.com/VisualStudio/feedback/details/539486/certain-method-calls-on-an-isolatedstoragefilestream-throw-an -例外 – bsiegel 2010-03-05 15:12:23

0

嘗試具有用於數據鎖定的量的大於0的值。此外,是否有任何數據在流中,如果沒有什麼可以鎖定,可能是問題....

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

我也試過以下內容: lockStream = new IsolatedStorageFileStream(「my.lck」,FileMode.OpenOrCreate,isoStore); lockStream.WriteByte(0xFF); lockStream.Lock(0,1); 這未能完全相同的方式。 – bsiegel 2010-03-04 22:29:19

+0

你如何聲明isoStore? – Hogan 2010-03-05 14:29:52

+0

我只是做一個基本的IsolatedStorageFile isoStore = IsolatedStorageFile。GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly,null,null); – bsiegel 2010-03-05 15:12:55