Re: Жизнь после Dispose (.net)
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 08.07.15 00:59
Оценка: +1
Здравствуйте, ylem, Вы писали:

Y>Есть самодельный класс, реализующий IDisposable и с одним методом GetNext, который или возвращает кое-что, или говорит, что нечего возвращать.

Y>https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx

Ok

Y>1. после вызова Dispose() метод GetNext() говорит, что возвращать нечего (вместо того, чтобы кидать эксепшн https://msdn.microsoft.com/en-us/library/system.objectdisposedexception(v=vs.110).aspx)


Y>2. вызовы к GetNext() и Dispose() асинхронные, но внутри встают в очередь. Сделал так, что GetNext(), начавшиеся до Dispose, результат вернут, а начавшиеся после -- нет.


Y>На сколько 1 и 2 "правильно" и соответствует ожиданиям от IDisposable?


Согласно Framework Design Guildelines, а значит и согласно принципу наименьшего удивления большинства .NET разработчиков, это поведение не будет соответствовать ожиданиям от использования IDisposable. Вышеуказанный букварь (и вот эта статья) четко устанавливают ожидания от поведения объекта после вызова метода Dispose: метод этот синхронный и последующий вызов любого другого экземплярного метода должен падать с ObjectDisposeException (двойнов вызов метода Dispose допустим, исключения быть не должно)..

Навскидку сложно сказать, что имеется ввиду под пунктом 2, особенно не имя сигнатуры метода GetNext (какой он такой асинхронный? Возвращает Task<Something>?).

Я бы посоветовал просто сделать метод Dispose обычным (синхронным) и уйти от этой проблемы. Т.е. вызов блокируется до тех пор, пока все текущие запросы, поставленные в очередь не будут обработаны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.