Подтвердить что ты не робот

WCF и IDisposable, я могу очистить управляемые объекты?

Я реализовал службу 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? Если я удалю мои управляемые объекты в таком случае, как и где я удалю обработчик событий (я мог бы сделать это в обработчике событий, но что, если возникает другой тип исключения/ошибки)?

4b9b3361

Ответ 1

Если вы реализуете IDisposable, вы можете очистить управляемые объекты внутри вашей реализации метода Dispose().

С PerSession InstanceContextMode среда выполнения WCF вызовет Dispose в вашем объекте SynchronisationService при завершении сеанса, потому что клиент закрыл свой прокси; из-за времени сеанса из-за неактивности (на клиенте или сервере); или через неисправность канала.

Экземпляр службы не будет использоваться повторно: новые сеансы получат новые экземпляры вашего SynchronisationService.