Я реализовал службу WCF как таковую:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single, UseSynchronizationContext=false)]
public sealed class SynchronizationService : ISynchronizationService, IDisposable
{
private MemoryStream objectStream;
...
}
ISyncrhonizationService имеет [ServiceContract (SessionMode = SessionMode.Required)].
Если клиент правильно связывается и, наконец, вызывает метод с помощью [IsTerminating = true], я могу легко распоряжаться переменной objectStream. Если по какой-то причине связь между службой и клиентом будет нарушена, я бы хотел очистить переменную objectStream со стороны службы, поэтому я хочу реализовать интерфейс IDisposable. Но, глядя на документацию MSDN (http://msdn.microsoft.com/en-us/library/system.idisposable.aspx), я немного скептически отношусь к этому, потому что согласно документации:
// Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.
Потому что это время выполнения, которое вызовет метод Dispose, а затем dispose = false. Таким образом, я не должен обращаться к objectStream, потому что это управляемый объект. В этом случае финализатор SyncrhonizationService, предоставляемый средой выполнения, должен очистить сам объектStream, и мне вообще не нужно реализовывать IDisposable. Тем не менее, некоторые сообщения на форумах предполагают, что экземпляр SyncrhonizationService вместо этого будет повторно использован, а не удален/завершен.
Итак, мои вопросы:
1) Что на самом деле происходит с экземпляром SyncrhonizationService во время исключений/сбоев/тайм-аутов/etc? Будет ли он удален или просто повторно использован позднее?
2) Нужно ли мне реализовать IDisposable и ли я распоряжаться управляемыми объектами внутри метода Dispose()?
3) Возможно ли быть лучшей альтернативой IDisposable, например, что-то вроде события channel_Faulted? Если я удалю мои управляемые объекты в таком случае, как и где я удалю обработчик событий (я мог бы сделать это в обработчике событий, но что, если возникает другой тип исключения/ошибки)?