Problema StreamWriter

mercoledì 26 settembre 2012 - 17.23
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Visual Studio 2008  |  VBScript

sanghino Profilo | Junior Member

Salve a tutti, vi spiego brevemente qual'è il mio problema.

Ho sviluppato una dll con vb.net e framework 3.5 visibile COM. Questa verrà utilizzata da un software che al suo interno implementa un motore di scripting basato su vbs/vba.

Uno dei metodi messi a disposizione dalla dll serve per scrivere un semplice log in un file di testo. Per far questo utilizzo queste righe di codice:

Using logWriter As New StreamWriter(logFileName, True) logWriter.WriteLine(msg) logWriter.Flush() logWriter.Close() logWriter.Dispose() End Using

La dll in oggetto potrebbe essere istanziata più volte. Se il file non esiste viene creato e tutto fila liscio, se al contrario il file esiste, quindi non siamo al primo accesso alla risorsa, non scrive niente.

Sembra quasi che il file rimanga in lock dopo aver terminato il "primo giro". Ci sono accorgimenti particolari da prendere per ovviare ad eventuali lock ?
Pensate sia effettivamente un lock il problema ?

Grazie per le eventuali risposte.
Sanghino
--------------------------
www.extrageek.com

AntCiar Profilo | Expert

aggiungi anche

logWriter = nothing
Cristian Barca

sanghino Profilo | Junior Member

>aggiungi anche
>
>logWriter = nothing
>Cristian Barca

Ti ringrazio per la solerte risposta, purtroppo però la modifica che mi proponi non è applicabile in quanto "la variabile 'Read Only' non può essere la destinazione di una assegnazione" ....
Sanghino
--------------------------
www.extrageek.com

algraps Profilo | Junior Member

Ciao,
scusate se mi intrometto. Avevo anch'io un problema di questo tipo ed era un problema di lock. Devi chiamare lo streamwriter in thread-safe mode. Prova in questo modo:

Dim strLogEntry As String
Dim oWrite As New System.IO.StreamWriter(Location)

oWrite = System.IO.StreamWriter.Synchronized(System.IO.File.AppendText(Location))
strLogEntry = DateTime.Now.ToString & ": " & p_strMessage & Environment.NewLine

oWrite.Write(strLogEntry)
oWrite.Flush()
oWrite.Dispose()
oWrite = Nothing

Fammi sapere.
Ciao
A.G.

Vinsent Profilo | Senior Member

>Pensate sia effettivamente un lock il problema ?

L' Using rilascia le risorse al suo termine quindi teoricamente non dovrebbe creare problemi...il programma o VS ti restituisce un' errore in particolare?
Comunque puoi verificare se il file è in uso più o meno così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Prima di scrivere nel file richiami la function e in base all' esito decidi cosa fare, esempio:
Select Case chkFile(path) Case "ok" 'scrivi nel file Case "in uso" 'forse un timer che riprova? Case "non esiste" 'crei il file End Select

ciao


sanghino Profilo | Junior Member

Ciao,
lo script non restituisce nessun errore, semplicemente non scrive.
In ogni modo proverò ad applicare i suggerimenti che mi sono stati dati e poi farò sapere.


Sanghino
--------------------------
www.extrageek.com

Feroxis Profilo | Junior Member

Forse sbaglio ma:
Non basterebbe?

imports system.io
imports system.io.streamwrite
imports system.io.streamreader
public msgdainserire as string

sub scrivi()

dim rd as new streamreader("c:\...")
dim value as string = rd.readtoend
rd.close

dim rw as new streamwriter("c:\...")
value = value & " " & vbcrlf & msgdainserire
rw.writeline(value)
rw.close


end sub

sanghino Profilo | Junior Member

>Forse sbaglio ma:
>Non basterebbe?
>
>imports system.io
>imports system.io.streamwrite
>imports system.io.streamreader
>public msgdainserire as string
>
>sub scrivi()
>
>dim rd as new streamreader("c:\...")
>dim value as string = rd.readtoend
>rd.close
>
>dim rw as new streamwriter("c:\...")
>value = value & " " & vbcrlf & msgdainserire
>rw.writeline(value)
>rw.close
>
>
>end sub
>


Una cosa molto simile a questa era stata la mia prima implementazione, ma per qualche strano motivo che non sono riuscito ad isolare ad un certo punto smette di scrivere. A quel punto mi è sorto il dubbio che la risorsa (leggi file di testo su cui scrivo) rimanesse per qualche motivo in stato di lock. Questo è quanto.

Saluti
Sanghino
--------------------------
www.extrageek.com

Vinsent Profilo | Senior Member

Se fai caso al codice della Function del mio post precedente puoi vedere che le istruzioni sono all' interno di un blocco try/catch, la funzione ritorna "in uso" quando il codice eseguito dopo Try genera un eccezione, in questo caso il file è in lock e l' eccezione viene gestita sempre dal blocco try/catch, in assenza di quest' ultimo se accedi al file ed è in lock dovrebbe comparirti una finestra di "errore eccezione non gestita", forse mi sbaglio...ma penso che l' errore sia da una altra parte.
Di più non so, sarebbe utile postare del codice o un progetto che presenta il problema per studiarlo.
ciao

Feroxis Profilo | Junior Member

Provato soltanto con close evitando il dispose, flush, e tutto il resto?

Nei primi esperimenti che feci io invece funzionavano in 2 sub differenti e se li mtettevo insieme invece no. Bah, ho risolto differentemente.
sub1
rd
end sub
sub2
wr
end sub

Problemi con Vs con il file aperto.

Vinsent Profilo | Senior Member

>Provato soltanto con close evitando il dispose, flush, e tutto
>il resto?

Con l' istruzione Using non dovrebbe esserci bisogno di dare Close e Dispose visto che al termine rilascia le risorse utilizzate.

>Nei primi esperimenti che feci io invece funzionavano in 2 sub
>differenti e se li mtettevo insieme invece no. Bah, ho risolto
>differentemente.
>sub1
>rd
>end sub
>sub2
>wr
>end sub
>
>Problemi con Vs con il file aperto.
>

Se usi StreamReader e StreamWriter nella stessa sub devi preoccuparti che il file non sia già utilizzato, mentre in due sub diverse dello stesso processo il discorso cambia, es:
Sub 1 fai questo fai quello End Sub
i due "fai" si possono accavallare per via dei tempi del PC, mentre
Sub 1 fai questo Sub 2() End Sub Sub 2 fai quello End Sub

"Sub 1" richiama "Sub 2" quando ha eseguito "fai questo"...almeno credo...spero di non sbagliarmi

Feroxis Profilo | Junior Member

Per essere sicuri forse è possibile fare:
1- Aprire il tutto in un exe a parte, e controllare il processo se è ancora aperto oppure no, richiami un'altro progetto possibile?
2- Inviare i dati periodicamente, immagazzini 10 righe e invii per esempio.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5