Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB.NET] Problema con SyncLock

    Ciao sono nuovo del forum e abbastanza acerbo di Vb.Net.
    Allora io ho questo problema ve lo riassumo così:

    ho 4 thread e 2 file xml. I thread 1 e 2 scrivono sul file A mentre i thread 3 e 4 scrivono sul file B.
    Per scrivere usano la funzione writeFileXML (fatta da me). Inizialmente la funzione mi andava a mangiare le nuove righe che andavo a scrivere dai thread concorrenti.
    Allora ho ottimizzato aggiungendo alla mia funzione l'istruzione SyncLock. Ho definito un object globale e la funzione è diventata come segue:

    Public shared Function writeFileXML(Byval nomefile as object) as String

    codice:
     
    Public shared Function writeFileXML(Byval nomefile as object) as String  
    	SyncLock globalobject 
    		' Codice di scrittura su file nomefile  
    	End syncLock  
    end Function
    così facendo sono riuscito a non mangiarmi le righe aggiunte.
    Sorge però il seguente problema, quando il thread 1 lancia la funzione writeFileXML, per scrivere sul file A, diventa bloccante anche per il thread 3 o 4 che vanno a scrivere sul file B.
    A questo punto ho pensato di utilizzzare come oggetto per l'istruzione SyncLock il nomefile passato alla funzione writeFileXML, ma questo mi ha dato un altro tipo di problema, il synclock non era più bloccante per nessun thread. Mi spiego meglio, thread 1 parte e richiama la funzione writeFileXML per scrivere sul file A, ma a questo punto parte il thread 2 che anch'esso scrive sul file A, io mi aspettavo che il SyncLock lo bloccasse invece lascia passare anche questo e cominciano a scrivere contemporaneamente sul file A facendomi danni.

    Ora mi sorge il dubbio di non aver capito bene come funziona l'istruzione SyncLock, e anche capire se è la cosa che serve per il mio problema.
    Potete darmi qualche dritta

    Grazie
    Davidivo

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539

    Re: [VB.NET] Problema con SyncLock



    devi usare due oggetti diversi da bloccare: uno per il thread 1 e 2 e l'altro per il 3 e 4, in questo modo l'oggetto 1 è bloccato per il thread 2 ma non per il 3 o 4. idem per l'oggetto 2 lascia libero 1 e 2 bloccando il 4 (se è partito il 3). quindi globalobject1 e globalobject2.

    questo per quanto riguarda la mia esperienza in c#, in vb credo sia lo stesso.
    tieni presente che per essere eseguiti (quasi) in parallelo dei usare almeno un dualcore.

  3. #3
    Ciao,
    innanzitutto grazie per la tua risposta.
    Questo ci conferma che quello che voglio fare è circa giusto.
    Il problema è che quello che ho citato è solo un esempio molto ridotto, in quanto io ho n file con n thread che girano e a priori non so quanto vale n.
    Il numero dei file e il numero dei thread è recuperato da un file xml.

    Per questo motivo pensavo di utilizzare il nomefile come variabile oggetto utilizzata dal SyncLock, in modo da avere tanti oggetti di Lock quanti sono i file.

    Sono andato avanti nelle prove e il problema sembra essere come creo nel thread chiamante l'oggetto "nomefile" che passo alla funzione writeFileXML. Se dichiaro l'oggetto in modo esplicito esempio:

    myobject = "nomefile.xml§nomeutente"

    i thread vengono bloccati correttamente dall'istruzione SyncLock in base a myobject.
    Se invece myobject lo creo a pezzi recuperando da un file le informazioni e concatenando tali informazioni tramite la & esempio:

    myobject = filename & user

    dove filename e user sono due variabili stringa.
    l'istruzione SyncLock non lavora correttamente, come se la concatenzione generasse oggetti tutti diversi.
    E' possibile tutto questo????? o sono ormai alle cozze?

  4. #4
    Ragazzi,

    Forse ci siamo!!! Ma magari è una CAG....TA PAZZESCA!

    Sfruttando il suggerimento di U235, abbiamo creato un hastable shared a cui aggiungiamo un oggetto per ogni file che deve essere usato.
    A questo punto facciamo il syncLock sull'oggetto etichettato da nomefile:


    codice:
    Public shared Function writeFileXML(Byval nomefile as object) as String  
    	SyncLock sharedHashtableObject(nomefile)
    		' Codice di scrittura su file nomefile  
    	End syncLock  
    end Function
    In questo modo parrebbe che i vari thread utenti sono lockati sui rispettivi file.

    Pessima idea?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.