tôi đã xác định DataContract
sau mà thực hiện IDisposable
:Tại sao Vứt bỏ đang được gọi trên DataContract mặc dù dịch vụ vẫn đề cập đến nó?
[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);
}
}
Và tôi gọi phương thức dịch vụ sau đi qua một thể hiện của hợp đồng dữ liệu trên:
[OperationContract]
[ServiceKnownType(typeof(RegularFileMetadata))]
Guid BeginUpload(FileMetadataBase metadata);
Trong việc thực hiện BeginUpload
, tôi chỉ đơn giản lưu siêu dữ liệu vào từ điển là:
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 ;
}
Câu hỏi của tôi là ngay lập tức sau khi trở về từ phương pháp này, tại sao Dispose()
được gọi mặc dù tôi đã lưu phiên bản trong từ điển _Dict
?
Tôi đã xác minh rằng Dispose()
phương pháp được gọi là trên cùng dụ mà tôi đã lưu trong từ điển của tôi, như _Disposed
trở thành true
cho lưu đối tượng, tức là _Dict[sessionId]._Disposed
trở thành true
!
Các hành vi phục vụ dịch vụ của tôi được thiết lập như:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Bạn có ssure rằng Dispose (..) được gọi trên ** cùng một trường hợp ** bạn đã tạo? Ý tôi là, * có thể * đã tạo ra một thể hiện khác của lớp và Dispose (..) được gọi là * đó * một. Kiểm tra * hashcode * của trường hợp bạn nhận được Dispose (..) trên ... – Tigran
@Tigran: Có ... – Nawaz
@Tigran: Tôi đã cập nhật câu hỏi của mình với: * "Tôi đã xác minh rằng phương thức Dispose() được gọi trên cùng một ví dụ mà tôi đã lưu trong từ điển của tôi, vì _Disposed trở thành sự thật cho đối tượng đã lưu. "* – Nawaz