Ho definito il seguente DataContract
che implementa IDisposable
:Perché Dispose viene chiamato su DataContract anche se il servizio si riferisce ancora ad esso?
[DataContract]
public class RegularFileMetadata : FileMetadataBase, IDisposable
{
bool _Disposed = false; //note this!
//...
protected virtual void Dispose(bool disposing)
{
if (!_Disposed)
{
//...
_Disposed = true; //note this too!
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
E io chiamare il seguente metodo di servizio passando un'istanza del contratto dei dati di cui sopra:
[OperationContract]
[ServiceKnownType(typeof(RegularFileMetadata))]
Guid BeginUpload(FileMetadataBase metadata);
Per l'attuazione del BeginUpload
, ho semplicemente salva metadati in un dizionario come:
Dictionary<Guid, RegularFileMetadata> _Dict;
public Guid BeginUpload(FileMetadataBase fileMetadata)
{
//...
var metadata = fileMetadata as RegularFileMetadata;
Guid sessionId = Guid.NewGuid();
_Dict.Add(sessionId, metadata); //metadata SAVED!
return sessionId ;
}
La mia domanda è, immediatamente dopo il ritorno da questo metodo, perché Dispose()
viene chiamato anche se ho salvato l'istanza nel dizionario _Dict
?
Ho verificato che Dispose()
metodo viene chiamato sulla stesso esempio che ho salvato nel mio dizionario, come _Disposed
diventa true
per la salvati oggetto, cioè _Dict[sessionId]._Disposed
diventa true
!
Il comportamento di servizio del mio servizio è impostato come:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Sei ssure che Dispose (..) viene chiamato sul ** stessa istanza ** che hai creato? Voglio dire, * potrebbe essere * è stata creata un'altra istanza della classe e Dispose (..) è stato chiamato * that * one. Controlla * codice hash * dell'istanza che ottieni Dispose (..) su ... – Tigran
@Tigran: Sì ... – Nawaz
@Tigran: Ho aggiornato la mia domanda con: * "Ho verificato che il metodo Dispose() è chiamato sul stessa istanza che ho salvato nel mio dizionario, poiché _Disposed diventa true per l'oggetto salvato. "* – Nawaz