Я реализовал службу 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's 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, тогда утилизация = false. Таким образом, я не должен обращаться к objectStream, потому что это управляемый объект. В этом случае финализатор SyncrhonizationService, предоставляемый средой выполнения, должен очистить сам объект ObjectStream, и мне вообще не нужно реализовывать IDisposable. Однако в некоторых сообщениях на форуме предполагается, что экземпляр SyncrhonizationService будет использоваться повторно, а не удаляться / завершаться.
Итак, мои вопросы:
1) Что на самом деле происходит с экземпляром SyncrhonizationService во время исключений / неисправностей / тайм-аутов / и т. Д.? Будет ли он утилизирован или просто повторно использован позднее?
2) Нужно ли реализовывать IDisposable и избавляться от управляемых объектов внутри метода Dispose ()?
3) Возможно, есть лучшая альтернатива IDisposable, например, что-то вроде channel_Faults? Если я распоряжусь своими управляемыми объектами в таком случае, как и где я буду удалять обработчик событий (я мог бы сделать это в обработчике событий, но что, если произойдет другой тип исключения / ошибки)?