|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Aug 2008
Messaggi: 25
|
Filestream : problema di lock/unlock
Ciao a tutti ,
Stavo cercando aiuto ad un problema strano che mi capita usando l'oggetto filestream. In particolare avevo bisogno di condividere un file fra diversti utenti e cosi ho codificato queste linee di codice che qui riporto in parte per facilità di lettura : Codice:
. . . . . . public enum dbLockType { _none =0, _lock, _unLock, _default} long lockPos = -1; long lockRec = -1; FileStream DtFile = new FileStream(@"\\server\d\folder\test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,8000); . . . . . . public bool getBufferFromDisk(long RecordNumber, byte[] toArray, int startingAt, int length, dbLockType dbLock) { long seekPosition = GetFilePos(RecordNumber); try { DtFile .Seek(seekPosition, System.IO.SeekOrigin.Begin); DtFile .Read(toArray, startingAt, length); if ( dbLock == dbLockType._lock) { if ( lockPos > -1) DtFile .Unlock(lockPos, blockSize); // unlock previous locks DtFile .Lock(seekPosition, blockSize); lockPos = seekPosition; lockRec = RecordNumber; } } catch(IOException e) { return false; } return true; } getBufferFromDisk(8, toArray, 500, 100, dbLock); in questo modo legge e blocca il filestream alla pos 500 per 100 bytes. Il secondo utente lo stesso pgm da una altro PC e cerca di eseguire la stessa funzione con i seguenti parametri: getBufferFromDisk(0, toArray, 0, 100, dbLock); è in questo punto che viene gererato l'errore di lettura a questa specifica. DtFile .Read(toArray, startingAt, length); così ho inserito il blocco Try-catch per protezione. Strano , ho pensato, perchè il primo utente ha bloccato 100 bytes a partire dalla pos 500 e non dalla Pos 0. Dopo un po di googling ho trovato questo articolo che forse riprende il mio caso : http://www.devnewsgroups.net/group/m...opic15633.aspx Così ho giocato un po per capire meglio il problema e ho trovato che : 1. anche se viene modificata la lettura in .Read ( tenendo il primo user con il pgm aperto e la pos loccata ) il secondo utente trova sempre la posizione 0 loccata. 2. Il lock è esteso all'intero buffer , che è di 8K. 3. Tutto questo è vero se il secondo utente cerca di leggere qualcosa in questo buffer se qualcosa in questo buffer è loccato , altrimenti tutto fila liscio senza exceptions. Voglio dire che se il primo user locca qualcosa alla posizione 8500 , 100 il secondo utente che legge alla pos. 0 non ha nessun problema. Cosa è questo ? , un bug? Sto sbagliando io qualcosa nella codifica o che cosa? E' questo il modo corretto di lavorare con lock e unlock Qualcuno può aiutarmi a risolvere il problema grazie a tutti , JossGP |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:55.