I zostały zdefiniowane następujące DataContract
który implementuje IDisposable
:Dlaczego Dispose jest wywoływana w DataContract, mimo że usługa wciąż go odsyła?
[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);
}
}
i wzywam następujące metody usługi przechodzącego wystąpienie powyższej umowy danych:
[OperationContract]
[ServiceKnownType(typeof(RegularFileMetadata))]
Guid BeginUpload(FileMetadataBase metadata);
W realizacji BeginUpload
, po prostu zapisz metadanych w słowniku jako:
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 ;
}
Moje pytanie brzmi, zaraz po powrocie z tej metody, dlaczego jest wywoływana Dispose()
, mimo że zapisałem wystąpienie w słowniku _Dict
?
I sprawdzeniu, że Dispose()
metoda jest wywoływana na samym instancji, które mam zapisane w moim słowniku, jak _Disposed
staje true
dla zapisane obiektu, tj _Dict[sessionId]._Disposed
staje true
!
Zachowanie serwis mojego usługi jest ustawiony jako:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Czy jesteś ssure że Dispose (..) jest wywoływana na ** ta sama ** utworzona przez ciebie instancja? Mam na myśli, * może być * utworzono kolejną instancję klasy i Dispose (...) została wywołana * tą * jedną. Sprawdź * hashcode * instancji, którą otrzymasz Dispose (..) na ... – Tigran
@ Tigran: Tak ... – Nawaz
@ Tigran: Zaktualizowałem moje pytanie: * "Sprawdziłem, że metoda Dispose() jest wywoływana to samo wystąpienie, które zapisałem w słowniku, ponieważ _Disposed staje się prawdziwe dla zapisanego obiektu. "* – Nawaz